/ Hex Artifact Content
Login

Artifact 9d19d3f8dcddd1b644b72f1c6613d44692a7a846:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3ba0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3bb0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bc0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3bf0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3c00: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c10: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c20: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c30: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c40: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c50: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c60: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c70: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c80: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c90: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3ca0: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3cb0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cc0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3ce0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3cf0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3d00: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d10: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d40: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d50: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d60: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d90: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3da0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3db0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3dc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dd0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3de0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3df0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3e00: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e10: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e20: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e30: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e40: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e50: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e70: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e80: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e90: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3ea0: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3eb0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3ec0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ed0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ee0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ef0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3f00: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f10: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f20: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f30: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f40: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f50: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f60: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f70: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f80: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f90: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3fa0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fb0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fc0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fd0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fe0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3ff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4000: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4010: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4020: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4040: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4050: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4060: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4070: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4080: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4090: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
40a0: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40c0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40d0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40e0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
40f0: 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e  f( pBtree->hasIn
4100: 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72  crblobCur==0 ) r
4110: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
4120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
4130: 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20  dsMutex(pBtree) 
4140: 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68 61 73  );.  pBtree->has
4150: 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b  IncrblobCur = 0;
4160: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
4170: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
4180: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
4190: 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c     if( (p->curFl
41a0: 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62  ags & BTCF_Incrb
41b0: 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  lob)!=0 ){.     
41c0: 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72   pBtree->hasIncr
41d0: 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20 20 20  blobCur = 1;.   
41e0: 20 20 20 69 66 28 20 69 73 43 6c 65 61 72 54 61     if( isClearTa
41f0: 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e  ble || p->info.n
4200: 4b 65 79 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20  Key==iRow ){.   
4210: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
4220: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
4230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4240: 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a   }.}..#else.  /*
4250: 20 53 74 75 62 20 66 75 6e 63 74 69 6f 6e 20 77   Stub function w
4260: 68 65 6e 20 49 4e 43 52 42 4c 4f 42 20 69 73 20  hen INCRBLOB is 
4270: 6f 6d 69 74 74 65 64 20 2a 2f 0a 20 20 23 64 65  omitted */.  #de
4280: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 49  fine invalidateI
4290: 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 78  ncrblobCursors(x
42a0: 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20  ,y,z).#endif /* 
42b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
42c0: 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  BLOB */../*.** S
42d0: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
42e0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
42f0: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
4300: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
4310: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
4320: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
4330: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
4340: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
4350: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
4360: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
4370: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4380: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
4390: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
43a0: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
43b0: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
43c0: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
43d0: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
43e0: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
43f0: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
4400: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
4410: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
4420: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
4430: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
4440: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
4450: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
4460: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
4470: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4480: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4490: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
44a0: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
44b0: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
44c0: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
44d0: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
44e0: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
44f0: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
4500: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
4510: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
4520: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
4530: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
4540: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
4550: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
4560: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4570: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
4580: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
4590: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
45a0: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
45b0: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
45c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
45d0: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
45e0: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
45f0: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
4600: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
4610: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
4620: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
4630: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
4640: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
4650: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
4660: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
4670: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
4680: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
4690: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
46a0: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
46b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
46c0: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
46d0: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
46e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
46f0: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
4700: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
4710: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
4720: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
4730: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4740: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
4750: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
4760: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
4770: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4780: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
4790: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
47b0: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
47c0: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
47d0: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
47e0: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
47f0: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
4800: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
4810: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
4820: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
4830: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
4840: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
4850: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4860: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
4870: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
4880: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
4890: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
48a0: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
48b0: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
48c0: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
48d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
48e0: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
48f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4900: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
4910: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
4920: 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68  is omitted if th
4930: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
4940: 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  bit is already.*
4950: 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65  * set in BtShare
4960: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54  d.pHasContent. T
4970: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
4980: 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c  he bitvec are cl
4990: 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20  eared.** at the 
49a0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61  end of every tra
49b0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
49c0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74  tic int btreeSet
49d0: 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61  HasContent(BtSha
49e0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
49f0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  gno){.  int rc =
4a00: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4a10: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4a20: 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ent ){.    asser
4a30: 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50  t( pgno<=pBt->nP
4a40: 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  age );.    pBt->
4a50: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
4a60: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
4a70: 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  e(pBt->nPage);. 
4a80: 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61     if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4ab0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ac0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4ad0: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4ae0: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4af0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4b00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4b10: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4b20: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4b30: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4b40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4b50: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
4b60: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
4b70: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
4b80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
4b90: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
4ba0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
4bb0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4bc0: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4bd0: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4be0: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4bf0: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4c00: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4c10: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4c20: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4c30: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4c40: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4c50: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
4c60: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
4c70: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4c80: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4c90: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
4ca0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
4cb0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4cc0: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4cd0: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4ce0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4cf0: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4d10: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4d20: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4d30: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4d40: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4d50: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
4d60: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
4d70: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
4d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4d90: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
4da0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
4db0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4dc0: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4dd0: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4de0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4df0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
4e00: 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68  elease all of th
4e10: 65 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73  e apPage[] pages
4e20: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a   for a cursor..*
4e30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e40: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
4e50: 73 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f  sorPages(BtCurso
4e60: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
4e70: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
4e80: 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
4e90: 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
4ea0: 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
4eb0: 5b 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  [i]);.    pCur->
4ec0: 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20  apPage[i] = 0;. 
4ed0: 20 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65   }.  pCur->iPage
4ee0: 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   = -1;.}../*.** 
4ef0: 54 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  The cursor passe
4f00: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
4f10: 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e  gument must poin
4f20: 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  t to a valid ent
4f30: 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20  ry.** when this 
4f40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
4f50: 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53  ed (i.e. have eS
4f60: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
4f70: 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ID). This.** fun
4f80: 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20  ction saves the 
4f90: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b  current cursor k
4fa0: 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20  ey in variables 
4fb0: 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a  pCur->nKey and.*
4fc0: 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51  * pCur->pKey. SQ
4fd0: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
4fe0: 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
4ff0: 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  l or an SQLite e
5000: 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74  rror .** code ot
5010: 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  herwise..**.** I
5020: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
5030: 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65  open on an intke
5040: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
5050: 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a  e integer key.**
5060: 20 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20   (the rowid) is 
5070: 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e  stored in pCur->
5080: 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70  nKey and pCur->p
5090: 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20  Key is left set 
50a0: 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74  to.** NULL. If t
50b0: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
50c0: 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  n on a non-intke
50d0: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43  y table, then pC
50e0: 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20  ur->pKey is .** 
50f0: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
5100: 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65  a malloced buffe
5110: 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74  r pCur->nKey byt
5120: 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
5130: 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65  ining .** the ke
5140: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
5150: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42   saveCursorKey(B
5160: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5170: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5180: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
5190: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
51a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
51b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
51c0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
51d0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
51e0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
51f0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
5200: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
5210: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
5220: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
5230: 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  KeySize() cannot
5240: 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49   fail */..  /* I
5250: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
5260: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
5270: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
5280: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
5290: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
52a0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
52b0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
52c0: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
52d0: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
52e0: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
52f0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
5300: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
5310: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
5320: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
5330: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
5340: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
5350: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
5360: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
5370: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70  .  */.  if( 0==p
5380: 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
5390: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
53a0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
53b0: 28 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  ( pCur->nKey );.
53c0: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
53d0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
53e0: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
53f0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5400: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5410: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5420: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5430: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5440: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5450: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5460: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5470: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5480: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5490: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
54a0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
54b0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21  ->curIntKey || !
54c0: 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20  pCur->pKey );.  
54d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
54e0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
54f0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5500: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
5510: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
5520: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
5530: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
5540: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
5550: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
5560: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a  EQUIRESEEK..**.*
5570: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
5580: 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  t ensure that th
5590: 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
55a0: 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43  d (has eState==C
55b0: 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20  URSOR_VALID).** 
55c0: 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
55d0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
55e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
55f0: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5600: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
5610: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
5620: 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
5630: 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
5640: 74 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49  te || CURSOR_SKI
5650: 50 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74  PNEXT==pCur->eSt
5660: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
5670: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5680: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5690: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
56a0: 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75  r) );..  if( pCu
56b0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
56c0: 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20  R_SKIPNEXT ){.  
56d0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
56e0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
56f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
5700: 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
5710: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65    }..  rc = save
5720: 43 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b  CursorKey(pCur);
5730: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5740: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65  E_OK ){.    btre
5750: 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
5760: 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20  rPages(pCur);.  
5770: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
5780: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
5790: 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61  EEK;.  }..  inva
57a0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
57b0: 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74  che(pCur);.  ret
57c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
57d0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
57e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
57f0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5800: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5810: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5820: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5830: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5840: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5850: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5860: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5870: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5880: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5890: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
58a0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
58b0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
58c0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
58d0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
58e0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
58f0: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5900: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5910: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5920: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5930: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5940: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5950: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5960: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5970: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5980: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5990: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
59a0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
59b0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
59c0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
59d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
59e0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
59f0: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5a00: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5a10: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5a20: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5a30: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5a40: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5a50: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5a60: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5a70: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5a80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5a90: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5aa0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5ab0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5ac0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ad0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5ae0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5af0: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5b00: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5b10: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5b20: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5b30: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5b40: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5b50: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5b60: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5b70: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5b80: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5b90: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5ba0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5bb0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5bc0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5bd0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5be0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5bf0: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5c00: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5c10: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5c20: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5c30: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5c40: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5c50: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5c60: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5c80: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5c90: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5ca0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5cb0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5cc0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5cd0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ce0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5cf0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5d00: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5d10: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5d20: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5d30: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5d40: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5d50: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5d60: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5d70: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5d80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5d90: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5da0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5db0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5dc0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5dd0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5de0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
5df0: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
5e00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5e10: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
5e20: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
5e30: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
5e40: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
5e50: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
5e60: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
5e70: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
5e80: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
5e90: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
5ea0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
5eb0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
5ec0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
5ed0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
5ee0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
5ef0: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
5f00: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
5f10: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
5f20: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
5f30: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
5f40: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
5f50: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
5f60: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
5f70: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
5f80: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
5f90: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
5fa0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
5fb0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
5fc0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
5fd0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
5fe0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
5ff0: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6000: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6010: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6020: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6030: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6040: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6050: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6060: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6070: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6080: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6090: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
60a0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
60b0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
60c0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
60d0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
60e0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
60f0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6100: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6130: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6140: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6150: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6160: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6170: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6180: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
6190: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
61a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
61b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
61c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
61d0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
61e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
61f0: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6200: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6210: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6220: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6230: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6240: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6250: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6260: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6270: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
6290: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
62a0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
62b0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
62c0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
62d0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
62e0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
62f0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6300: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6310: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6320: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6330: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6340: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6350: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6360: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6370: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6380: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
6390: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
63a0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
63b0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
63c0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
63d0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
63e0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
63f0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6400: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6410: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6420: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6430: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6450: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6460: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6470: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6480: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
6490: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
64a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
64b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64c0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
64d0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
64e0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
64f0: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6500: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
6510: 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20  r aSpace[200];  
6520: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
6530: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
6540: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
6550: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
6560: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
6570: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
6580: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
6590: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
65a0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
65b0: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
65c0: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
65d0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
65e0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
65f0: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
6600: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
6610: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6630: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
6640: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6650: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6660: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6670: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6680: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6690: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
66a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
66b0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
66c0: 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  , pFree);.      
66d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
66e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
66f0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
6700: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
6710: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
6720: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
6730: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6740: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6750: 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
6760: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6770: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6780: 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b  nfo->db, pFree);
6790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
67a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
67b0: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
67c0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
67d0: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
67e0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
67f0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
6800: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6810: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
6820: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
6830: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6840: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6850: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6860: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6870: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6880: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6890: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
68a0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
68b0: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
68c0: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
68d0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
68e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
68f0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
6900: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
6910: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
6920: 20 72 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e   rc;.  int skipN
6930: 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ext;.  assert( c
6940: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6950: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6960: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6970: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6980: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6990: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
69a0: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
69b0: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
69c0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
69d0: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
69e0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
69f0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
6a00: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
6a10: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
6a20: 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28  skipNext);.  if(
6a30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6a40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6a50: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6a60: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
6a70: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
6a80: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6a90: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
6aa0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6ab0: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
6ac0: 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
6ad0: 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20   |= skipNext;.  
6ae0: 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
6af0: 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53  Next && pCur->eS
6b00: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6b10: 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ID ){.      pCur
6b20: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6b30: 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20  R_SKIPNEXT;.    
6b40: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6b50: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
6b60: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6b70: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
6b80: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6b90: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
6ba0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
6bb0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6bc0: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
6bd0: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
6be0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
6bf0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
6c00: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
6c10: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
6c20: 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61  n where.** it wa
6c30: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f  s last placed, o
6c40: 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c  r has been inval
6c50: 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f  idated for any o
6c60: 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20  ther reason..** 
6c70: 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65  Cursors can move
6c80: 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68   when the row th
6c90: 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20  ey are pointing 
6ca0: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
6cb0: 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20  t.** from under 
6cc0: 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  them, for exampl
6cd0: 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74  e.  Cursor might
6ce0: 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20   also move if a 
6cf0: 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61  btree.** is reba
6d00: 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61  lanced..**.** Ca
6d10: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
6d20: 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63  ne with a NULL c
6d30: 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65  ursor pointer re
6d40: 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  turns false..**.
6d50: 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72  ** Use the separ
6d60: 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  ate sqlite3Btree
6d70: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20  CursorRestore() 
6d80: 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f  routine to resto
6d90: 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62  re a cursor.** b
6da0: 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20  ack to where it 
6db0: 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74  ought to be if t
6dc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6dd0: 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74  rns true..*/.int
6de0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6df0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
6e00: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
6e10: 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61  eturn pCur->eSta
6e20: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6e30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6e40: 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73  routine restores
6e50: 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74   a cursor back t
6e60: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70  o its original p
6e70: 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74  osition after it
6e80: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76  .** has been mov
6e90: 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69  ed by some outsi
6ea0: 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63  de activity (suc
6eb0: 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62  h as a btree reb
6ec0: 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72  alance or.** a r
6ed0: 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64  ow having been d
6ee0: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
6ef0: 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
6f00: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  ).  .**.** On su
6f10: 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66  ccess, the *pDif
6f20: 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65  ferentRow parame
6f30: 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20  ter is false if 
6f40: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
6f50: 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61  ft.** pointing a
6f60: 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  t exactly the sa
6f70: 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65  me row.  *pDiffe
6f80: 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f  rntRow is the ro
6f90: 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  w the cursor.** 
6fa0: 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  was pointing to 
6fb0: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
6fc0: 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75  , forcing the cu
6fd0: 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
6fe0: 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20   some.** nearby 
6ff0: 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  row..**.** This 
7000: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
7010: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f  nly be called fo
7020: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
7030: 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a  just returned.**
7040: 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74   TRUE from sqlit
7050: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
7060: 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20  Moved()..*/.int 
7070: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7080: 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73  orRestore(BtCurs
7090: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
70a0: 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20  DifferentRow){. 
70b0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
70c0: 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20  rt( pCur!=0 );. 
70d0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
70e0: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
70f0: 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  LID );.  rc = re
7100: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
7110: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
7120: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66   rc ){.    *pDif
7130: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
7140: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
7150: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
7160: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
7170: 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  ID ){.    *pDiff
7180: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7190: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
71a0: 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
71b0: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69  t==0 );.    *pDi
71c0: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a  fferentRow = 0;.
71d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
71e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
71f0: 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74   Provide hints t
7200: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  o the cursor.  T
7210: 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 68 69  he particular hi
7220: 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68  nt given (and th
7230: 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75  e type.** and nu
7240: 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61 72 61  mber of the vara
7250: 72 67 73 20 70 61 72 61 6d 65 74 65 72 73 29 20  rgs parameters) 
7260: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
7270: 20 74 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a   the eHintType.*
7280: 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65  * parameter.  Se
7290: 65 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  e the definition
72a0: 73 20 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48  s of the BTREE_H
72b0: 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72  INT_* macros for
72c0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69   details..*/.voi
72d0: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
72e0: 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f  rsorHint(BtCurso
72f0: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69  r *pCur, int eHi
7300: 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20  ntType, ...){.  
7310: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
7320: 5f 73 74 61 72 74 28 61 70 2c 20 65 48 69 6e 74  _start(ap, eHint
7330: 54 79 70 65 29 3b 0a 23 69 66 64 65 66 20 53 51  Type);.#ifdef SQ
7340: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
7350: 4f 52 5f 48 49 4e 54 53 0a 20 20 69 66 28 20 65  OR_HINTS.  if( e
7360: 48 69 6e 74 54 79 70 65 3d 3d 42 54 52 45 45 5f  HintType==BTREE_
7370: 48 49 4e 54 5f 46 4c 41 47 53 20 29 0a 23 65 6c  HINT_FLAGS ).#el
7380: 73 65 0a 20 20 61 73 73 65 72 74 28 20 65 48 69  se.  assert( eHi
7390: 6e 74 54 79 70 65 3d 3d 42 54 52 45 45 5f 48 49  ntType==BTREE_HI
73a0: 4e 54 5f 46 4c 41 47 53 20 29 3b 0a 23 65 6e 64  NT_FLAGS );.#end
73b0: 69 66 0a 20 20 7b 0a 20 20 20 20 70 43 75 72 2d  if.  {.    pCur-
73c0: 3e 68 69 6e 74 73 20 3d 20 76 61 5f 61 72 67 28  >hints = va_arg(
73d0: 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ap, unsigned int
73e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
73f0: 43 75 72 2d 3e 68 69 6e 74 73 3d 3d 42 54 52 45  Cur->hints==BTRE
7400: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 70 43 75  E_SEEK_EQ || pCu
7410: 72 2d 3e 68 69 6e 74 73 3d 3d 42 54 52 45 45 5f  r->hints==BTREE_
7420: 42 55 4c 4b 4c 4f 41 44 0a 20 20 20 20 20 20 20  BULKLOAD.       
7430: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72           || pCur
7440: 2d 3e 68 69 6e 74 73 3d 3d 30 20 29 3b 0a 20 20  ->hints==0 );.  
7450: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
7460: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7470: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
7480: 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  M./*.** Given a 
7490: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
74a0: 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73   regular databas
74b0: 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74  e page, return t
74c0: 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
74d0: 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65  r for the pointe
74e0: 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20  r-map page that 
74f0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74  contains the ent
7500: 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ry for the.** in
7510: 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  put page number.
7520: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
7530: 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67  (not a valid pag
7540: 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73  e) for pgno==1 s
7550: 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  ince there is.**
7560: 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   no pointer map 
7570: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7580: 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74  page 1.  The int
7590: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67  egrity_check log
75a0: 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74  ic.** requires t
75b0: 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  hat ptrmapPageno
75c0: 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61  (*,1)!=1..*/.sta
75d0: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
75e0: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
75f0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
7600: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
7610: 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20  MapPage;.  Pgno 
7620: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
7630: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7640: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
7650: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
7660: 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20  pgno<2 ) return 
7670: 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  0;.  nPagesPerMa
7680: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
7690: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
76a0: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
76b0: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
76c0: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
76d0: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
76e0: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
76f0: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
7700: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
7710: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
7720: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
7730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
7740: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
7750: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
7760: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7770: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
7780: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
7790: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
77a0: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
77b0: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
77c0: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
77d0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
77e0: 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  'pgno'..**.** If
77f0: 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c   *pRC is initial
7800: 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e  ly non-zero (non
7810: 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e  -SQLITE_OK) then
7820: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7830: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66  .** a no-op.  If
7840: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7850: 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  , the appropriat
7860: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
7870: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
7880: 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  *pRC..*/.static 
7890: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42  void ptrmapPut(B
78a0: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
78b0: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
78c0: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69  , Pgno parent, i
78d0: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61  nt *pRC){.  DbPa
78e0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
78f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7900: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
7910: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
7920: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7930: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
7940: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
7950: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7960: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
7970: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
7980: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
7990: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
79a0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
79b0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
79c0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
79d0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
79e0: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
79f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7a00: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7a10: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7a20: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
7a30: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
7a40: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
7a50: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
7a60: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
7a70: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
7a80: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
7a90: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
7aa0: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
7ab0: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
7ac0: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
7ad0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
7ae0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7af0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7b00: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
7b10: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
7b20: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
7b30: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
7b40: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
7b50: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
7b60: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
7b70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
7b80: 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
7b90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  turn;.  }.  offs
7ba0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
7bb0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
7bc0: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
7bd0: 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  t<0 ){.    *pRC 
7be0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7bf0: 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
7c00: 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d  ptrmap_exit;.  }
7c10: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7c20: 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75  t <= (int)pBt->u
7c30: 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20  sableSize-5 );. 
7c40: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
7c50: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
7c60: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
7c70: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
7c80: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
7c90: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
7ca0: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
7cb0: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
7cc0: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
7cd0: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
7ce0: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
7cf0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52  arent));.    *pR
7d00: 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  C= rc = sqlite3P
7d10: 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
7d20: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
7d30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7d40: 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65     pPtrmap[offse
7d50: 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20  t] = eType;.    
7d60: 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72    put4byte(&pPtr
7d70: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70  map[offset+1], p
7d80: 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arent);.    }.  
7d90: 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a  }..ptrmap_exit:.
7da0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7db0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ref(pDbPage);.}.
7dc0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65  ./*.** Read an e
7dd0: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f  ntry from the po
7de0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
7df0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
7e00: 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e  trieves the poin
7e10: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
7e20: 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72  r page 'key', wr
7e30: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70  iting.** the typ
7e40: 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  e and parent pag
7e50: 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54  e number to *pET
7e60: 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72  ype and *pPgno r
7e70: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
7e80: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
7e90: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
7ea0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
7eb0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
7ec0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
7ed0: 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28  c int ptrmapGet(
7ee0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7ef0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54  gno key, u8 *pET
7f00: 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  ype, Pgno *pPgno
7f10: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7f20: 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
7f30: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7f40: 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70  */.  int iPtrmap
7f50: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
7f60: 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65  er map page inde
7f70: 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  x */.  u8 *pPtrm
7f80: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
7f90: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61  nter map page da
7fa0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  ta */.  int offs
7fb0: 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  et;        /* Of
7fc0: 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e  fset of entry in
7fd0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a   pointer map */.
7fe0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
7ff0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8000: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
8010: 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61  ex) );..  iPtrma
8020: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
8030: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
8040: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
8050: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
8060: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
8070: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  ge);.  if( rc!=0
8080: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8090: 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61 70  c;.  }.  pPtrmap
80a0: 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33   = (u8 *)sqlite3
80b0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
80c0: 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74  Page);..  offset
80d0: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
80e0: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
80f0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
8100: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8110: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
8120: 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ge);.    return 
8130: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8140: 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  KPT;.  }.  asser
8150: 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e  t( offset <= (in
8160: 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  t)pBt->usableSiz
8170: 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e-5 );.  assert(
8180: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
8190: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
81a0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
81b0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
81c0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
81d0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
81e0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
81f0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
8200: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
8210: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
8220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8230: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
8240: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
8250: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
8260: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
8270: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
8280: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8290: 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20  ut(w,x,y,z,rc). 
82a0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
82b0: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
82c0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
82d0: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
82e0: 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64 69  (x, y, rc).#endi
82f0: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
8300: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
8310: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
8320: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
8330: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
8340: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
8350: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
8360: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
8370: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
8380: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
8390: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43  ent..**.** findC
83a0: 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f 65  ellPastPtr() doe
83b0: 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65 70  s the same excep
83c0: 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74 20  t it skips past 
83d0: 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34  the initial.** 4
83e0: 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
83f0: 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74  ter found on int
8400: 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66 20  erior pages, if 
8410: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a  there is one..**
8420: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8430: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
8440: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
8450: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
8460: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
8470: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
8480: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
8490: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
84a0: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c  age & get2byteAl
84b0: 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c  igned(&(P)->aCel
84c0: 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23  lIdx[2*(I)]))).#
84d0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50  define findCellP
84e0: 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20 20  astPtr(P,I) \.  
84f0: 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74 20  ((P)->aDataOfst 
8500: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
8510: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8520: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8530: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a  x[2*(I)]))).../*
8540: 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d 6d  .** This is comm
8550: 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73 69  on tail processi
8560: 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72 73  ng for btreePars
8570: 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a  eCellPtr() and.*
8580: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8590: 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20 74  PtrIndex() for t
85a0: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
85b0: 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66   cell does not f
85c0: 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f  it entirely.** o
85d0: 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72 65  n a single B-tre
85e0: 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65  e page.  Make ne
85f0: 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
8600: 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c 49  nts to the CellI
8610: 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nfo.** structure
8620: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
8630: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
8640: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
8650: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
8660: 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65 20  flow(.  MemPage 
8670: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8680: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
8690: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
86a0: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
86b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
86c0: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
86d0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
86e0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
86f0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
8700: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
8710: 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ){.  /* If the p
8720: 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20  ayload will not 
8730: 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f  fit completely o
8740: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
8750: 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  , we have.  ** t
8760: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8770: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8780: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8790: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
87a0: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
87b0: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
87c0: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
87d0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
87e0: 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65 20  used.  ** space 
87f0: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
8800: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
8810: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
8820: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a  cal storage.  **
8830: 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c   in between minL
8840: 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61  ocal and maxLoca
8850: 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72  l..  **.  ** War
8860: 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20  ning:  changing 
8870: 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77  the way overflow
8880: 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74   payload is dist
8890: 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20  ributed in any. 
88a0: 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65 73   ** way will res
88b0: 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  ult in an incomp
88c0: 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d  atible file form
88d0: 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d  at..  */.  int m
88e0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
88f0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8900: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8910: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78  lly */.  int max
8920: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
8930: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
8940: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
8950: 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c  y */.  int surpl
8960: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
8970: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
8980: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
8990: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c  orage */..  minL
89a0: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
89b0: 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63  nLocal;.  maxLoc
89c0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
89d0: 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20  ocal;.  surplus 
89e0: 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49  = minLocal + (pI
89f0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20  nfo->nPayload - 
8a00: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
8a10: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8a20: 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  e-4);.  testcase
8a30: 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f  ( surplus==maxLo
8a40: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8a50: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
8a60: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
8a70: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
8a80: 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f  cal ){.    pInfo
8a90: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8aa0: 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65  surplus;.  }else
8ab0: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
8ac0: 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f  cal = (u16)minLo
8ad0: 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f  cal;.  }.  pInfo
8ae0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
8af0: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
8b00: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
8b10: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  al] - pCell);.  
8b20: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70  pInfo->nSize = p
8b30: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
8b40: 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 4;.}../*.** Th
8b50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
8b60: 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65  ines are impleme
8b70: 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  ntations of the 
8b80: 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65  MemPage.xParseCe
8b90: 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  ll().** method..
8ba0: 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  **.** Parse a ce
8bb0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
8bc0: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
8bd0: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
8be0: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65  ure..**.** btree
8bf0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20  ParseCellPtr()  
8c00: 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65        =>   table
8c10: 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65   btree leaf node
8c20: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
8c30: 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20  ellNoPayload()  
8c40: 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65 65  =>   table btree
8c50: 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a   internal nodes.
8c60: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
8c70: 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e  lPtrIndex()   =>
8c80: 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e     index btree n
8c90: 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  odes.**.** There
8ca0: 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70   is also a wrapp
8cb0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65  er function btre
8cc0: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61  eParseCell() tha
8cd0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61  t works for.** a
8ce0: 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73  ll MemPage types
8cf0: 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72 65   and that refere
8d00: 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79  nces the cell by
8d10: 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74 68   index rather th
8d20: 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72  an.** by pointer
8d30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8d40: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8d50: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d  trNoPayload(.  M
8d60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
8d70: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
8d80: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
8d90: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
8da0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
8db0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
8dc0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
8dd0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8de0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8df0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8e00: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ure */.){.  asse
8e10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8e20: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
8e30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
8e40: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
8e50: 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  af==0 );.  asser
8e60: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
8e70: 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  oad );.  assert(
8e80: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8e90: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
8ea0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8eb0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8ec0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
8ed0: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
8ee0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
8ef0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
8f00: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
8f10: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
8f20: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
8f30: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
8f40: 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20  Info->iOverflow 
8f50: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
8f60: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
8f70: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
8f80: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
8f90: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
8fa0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8fb0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8fc0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8fd0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8ff0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9000: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9010: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9020: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9030: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9040: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9060: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9070: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9080: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9090: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
90a0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
90b0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
90c0: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
90d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
90e0: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
90f0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9100: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9110: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9120: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9130: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9140: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9150: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9160: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9170: 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79   || pPage->noPay
9180: 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74  load );.  assert
9190: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
91a0: 61 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ad==0 );.  asser
91b0: 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
91c0: 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72 74  Leaf );.  assert
91d0: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
91e0: 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70 49  rSize==0 );.  pI
91f0: 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20  ter = pCell;..  
9200: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63  /* The next bloc
9210: 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75  k of code is equ
9220: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a  ivalent to:.  **
9230: 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20  .  **     pIter 
9240: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
9250: 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  Iter, nPayload);
9260: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
9270: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
9280: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
9290: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
92a0: 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65  nPayload = *pIte
92b0: 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  r;.  if( nPayloa
92c0: 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75  d>=0x80 ){.    u
92d0: 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72  8 *pEnd = &pIter
92e0: 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  [8];.    nPayloa
92f0: 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  d &= 0x7f;.    d
9300: 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  o{.      nPayloa
9310: 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37  d = (nPayload<<7
9320: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9330: 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c  0x7f);.    }whil
9340: 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78 38  e( (*pIter)>=0x8
9350: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
9360: 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b  );.  }.  pIter++
9370: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  ;..  /* The next
9380: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69   block of code i
9390: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a  s equivalent to:
93a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70  .  **.  **     p
93b0: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
93c0: 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29 26  t(pIter, (u64*)&
93d0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
93e0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65  **.  ** The code
93f0: 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61   is inlined to a
9400: 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20  void a function 
9410: 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65  call..  */.  iKe
9420: 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66  y = *pIter;.  if
9430: 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b 0a  ( iKey>=0x80 ){.
9440: 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26      u8 *pEnd = &
9450: 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69 4b  pIter[7];.    iK
9460: 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ey &= 0x7f;.    
9470: 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20  while(1){.      
9480: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37 29  iKey = (iKey<<7)
9490: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
94a0: 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  x7f);.      if( 
94b0: 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29 20  (*pIter)<0x80 ) 
94c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
94d0: 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b 0a   pIter>=pEnd ){.
94e0: 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28          iKey = (
94f0: 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49  iKey<<8) | *++pI
9500: 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ter;.        bre
9510: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9520: 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  }.  }.  pIter++;
9530: 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20  ..  pInfo->nKey 
9540: 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b 0a  = *(i64*)&iKey;.
9550: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
9560: 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  d = nPayload;.  
9570: 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20  pInfo->pPayload 
9580: 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63  = pIter;.  testc
9590: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
95a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
95b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50  ;.  testcase( nP
95c0: 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d  ayload==pPage->m
95d0: 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
95e0: 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
95f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
9600: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
9610: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
9620: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
9630: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
9640: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
9650: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
9660: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
9670: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
9680: 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20     pInfo->nSize 
9690: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31  = nPayload + (u1
96a0: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
96b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f  );.    if( pInfo
96c0: 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66  ->nSize<4 ) pInf
96d0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20  o->nSize = 4;.  
96e0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
96f0: 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b  = (u16)nPayload;
9700: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  .    pInfo->iOve
9710: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c  rflow = 0;.  }el
9720: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
9730: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
9740: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
9750: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
9760: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
9770: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9780: 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65  llPtrIndex(.  Me
9790: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
97a0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
97b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
97c0: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
97d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
97e0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
97f0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9800: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9810: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9820: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9830: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
9840: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
9850: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
9860: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
9870: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
9880: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
9890: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
98a0: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
98b0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
98c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
98d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
98e0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
98f0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
9900: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
9910: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
9920: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
9930: 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  f==0 );.  assert
9940: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
9950: 61 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72  ad==0 );.  pIter
9960: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
9970: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
9980: 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49    nPayload = *pI
9990: 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  ter;.  if( nPayl
99a0: 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  oad>=0x80 ){.   
99b0: 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74   u8 *pEnd = &pIt
99c0: 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c  er[8];.    nPayl
99d0: 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  oad &= 0x7f;.   
99e0: 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c   do{.      nPayl
99f0: 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c  oad = (nPayload<
9a00: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
9a10: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
9a20: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
9a30: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
9a40: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
9a50: 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65  ++;.  pInfo->nKe
9a60: 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  y = nPayload;.  
9a70: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
9a80: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49  = nPayload;.  pI
9a90: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9aa0: 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73  pIter;.  testcas
9ab0: 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61  e( nPayload==pPa
9ac0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
9ad0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9ae0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9af0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
9b00: 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65   nPayload<=pPage
9b10: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
9b20: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
9b30: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
9b40: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
9b50: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
9b60: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
9b70: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
9b80: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
9b90: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
9ba0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9bb0: 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29  nPayload + (u16)
9bc0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
9bd0: 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  .    if( pInfo->
9be0: 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d  nSize<4 ) pInfo-
9bf0: 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20  >nSize = 4;.    
9c00: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9c10: 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20  (u16)nPayload;. 
9c20: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
9c30: 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  low = 0;.  }else
9c40: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
9c50: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9c60: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9c70: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9c80: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9c90: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9ca0: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9cb0: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9cc0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9cd0: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
9ce0: 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   iCell,         
9cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
9d00: 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63   index.  First c
9d10: 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65  ell is 0 */.  Ce
9d20: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
9d30: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
9d40: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
9d50: 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78  */.){.  pPage->x
9d60: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
9d70: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9d80: 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b   iCell), pInfo);
9d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
9da0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
9db0: 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   are implementat
9dc0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ions of the MemP
9dd0: 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a  age.xCellSize.**
9de0: 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43   method..**.** C
9df0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
9e00: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
9e10: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
9e20: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
9e30: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
9e40: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
9e50: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
9e60: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
9e70: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
9e80: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
9e90: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
9ea0: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
9eb0: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
9ec0: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
9ed0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  cell pointer..**
9ee0: 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  .** cellSizePtrN
9ef0: 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e  oPayload()    =>
9f00: 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61     table interna
9f10: 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53  l nodes.** cellS
9f20: 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20  izePtr()        
9f30: 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e       =>   all in
9f40: 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c  dex nodes & tabl
9f50: 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a  e leaf nodes.*/.
9f60: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
9f70: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
9f80: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
9f90: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
9fa0: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
9fb0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
9fc0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
9fd0: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
9fe0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
9ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a010: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
a020: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
a030: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
a060: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
a070: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a080: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
a090: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
a0a0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
a0b0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
a0c0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
a0d0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
a0e0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
a0f0: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
a100: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
a110: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
a120: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
a130: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
a140: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
a150: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
a160: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
a170: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
a180: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
a190: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
a1a0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
a1b0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a1c0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
a1d0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
a1e0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
a1f0: 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d 3d  age->noPayload==
a200: 30 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20 2a  0 );.  nSize = *
a210: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69  pIter;.  if( nSi
a220: 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ze>=0x80 ){.    
a230: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d  pEnd = &pIter[8]
a240: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30  ;.    nSize &= 0
a250: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
a260: 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a     nSize = (nSiz
a270: 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  e<<7) | (*++pIte
a280: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
a290: 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e  while( *(pIter)>
a2a0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
a2b0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
a2c0: 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67  er++;.  if( pPag
a2d0: 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
a2e0: 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f   /* pIter now po
a2f0: 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d 62  ints at the 64-b
a300: 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76  it integer key v
a310: 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65  alue, a variable
a320: 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20   length .    ** 
a330: 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c  integer. The fol
a340: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76  lowing block mov
a350: 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e  es pIter to poin
a360: 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20 62  t at the first b
a370: 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20  yte.    ** past 
a380: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b  the end of the k
a390: 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20  ey value. */.   
a3a0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39   pEnd = &pIter[9
a3b0: 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a  ];.    while( (*
a3c0: 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26  pIter++)&0x80 &&
a3d0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
a3e0: 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e   }.  testcase( n
a3f0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a400: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a410: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
a420: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a430: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50  .  if( nSize<=pP
a440: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
a450: 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75  .    nSize += (u
a460: 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  32)(pIter - pCel
a470: 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  l);.    if( nSiz
a480: 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b  e<4 ) nSize = 4;
a490: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
a4a0: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
a4b0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
a4c0: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
a4d0: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
a4e0: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
a4f0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
a500: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
a510: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
a520: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
a530: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
a540: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
a550: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
a560: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
a570: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
a580: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
a590: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
a5a0: 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28  ze += 4 + (u16)(
a5b0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a5c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53    }.  assert( nS
a5d0: 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e  ize==debuginfo.n
a5e0: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
a5f0: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
a600: 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61  u16)nSize;.}.sta
a610: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
a620: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d  PtrNoPayload(Mem
a630: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
a640: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
a650: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34  Iter = pCell + 4
a660: 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
a670: 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70   over bytes of p
a680: 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45  Cell */.  u8 *pE
a690: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
a6a0: 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72   /* End mark for
a6b0: 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69   a varint */..#i
a6c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a6d0: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
a6e0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
a6f0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
a700: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
a710: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
a720: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
a730: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
a740: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
a750: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
a760: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
a770: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
a780: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
a790: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
a7a0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
a7b0: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
a7c0: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
a7d0: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
a7e0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
a7f0: 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65  buginfo;.  pPage
a800: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
a810: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
a820: 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  ginfo);.#else.  
a830: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
a840: 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a  (pPage);.#endif.
a850: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a860: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d  ->childPtrSize==
a870: 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49  4 );.  pEnd = pI
a880: 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65  ter + 9;.  while
a890: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
a8a0: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
a8b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65 62  );.  assert( deb
a8c0: 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75  uginfo.nSize==(u
a8d0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a8e0: 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  l) || CORRUPT_DB
a8f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
a900: 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c  6)(pIter - pCell
a910: 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51  );.}...#ifdef SQ
a920: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68  LITE_DEBUG./* Th
a930: 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20  is variation on 
a940: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73  cellSizePtr() is
a950: 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20   used inside of 
a960: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
a970: 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a  nts.** only. */.
a980: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
a990: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
a9a0: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
a9b0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
a9c0: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
a9d0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
a9e0: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
a9f0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
aa00: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
aa10: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
aa20: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
aa30: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
aa40: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
aa50: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
aa60: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
aa70: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
aa80: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
aa90: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
aaa0: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
aab0: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
aac0: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
aad0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
aae0: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
aaf0: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
ab00: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
ab10: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
ab20: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61  Cell!=0 );.  pPa
ab30: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
ab40: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
ab50: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
ab60: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
ab70: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
ab80: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
ab90: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
aba0: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
abb0: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
abc0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
abd0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
abe0: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
abf0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
ac00: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
ac10: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
ac20: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
ac30: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
ac40: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
ac50: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
ac60: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
ac70: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
ac80: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
ac90: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
aca0: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
acb0: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
acc0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
acd0: 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45  ..**.** EVIDENCE
ace0: 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31  -OF: R-44582-601
acf0: 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72  38 SQLite may fr
ad00: 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20  om time to time 
ad10: 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20  reorganize a.** 
ad20: 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74  b-tree page so t
ad30: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
ad40: 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66   freeblocks or f
ad50: 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61  ragment bytes, a
ad60: 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74  ll.** unused byt
ad70: 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  es are contained
ad80: 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61   in the unalloca
ad90: 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e  ted space region
ada0: 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c  , and all.** cel
adb0: 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69  ls are packed ti
adc0: 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64  ghtly at the end
add0: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
ade0: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
adf0: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
ae00: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
ae10: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
ae20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
ae30: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
ae40: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
ae50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
ae60: 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ess of the i-th 
ae70: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
ae80: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
ae90: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
aea0: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
aeb0: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aed0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
aee0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
aef0: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
af00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
af10: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
af20: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
af30: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
af40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
af50: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
af60: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
af70: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
af80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
af90: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
afa0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
afb0: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
afd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
afe0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
aff0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b000: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
b010: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
b020: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
b030: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
b040: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
b050: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
b060: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b070: 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  *src;        /* 
b080: 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e  Source of conten
b090: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
b0a0: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
b0b0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
b0c0: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
b0d0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
b0e0: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
b0f0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
b100: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
b110: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b120: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
b130: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
b140: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b150: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
b160: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b170: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
b180: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
b190: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
b1a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
b1b0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
b1c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b1d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
b1e0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
b1f0: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
b200: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
b210: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
b220: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
b230: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
b240: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
b250: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
b260: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
b270: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
b280: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
b290: 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c  r+3]) );.  usabl
b2a0: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
b2b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
b2c0: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
b2d0: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ize;.  iCellFirs
b2e0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
b2f0: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c   2*nCell;.  iCel
b300: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
b310: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
b320: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
b330: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
b340: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
b350: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
b360: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
b370: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
b380: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
b390: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
b3a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b3b0: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
b3c0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b3d0: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
b3e0: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
b3f0: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
b400: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
b410: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
b420: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50  ge().    ** if P
b430: 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f  RAGMA cell_size_
b440: 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f  check=ON..    */
b450: 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c  .    if( pc<iCel
b460: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
b470: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
b480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b490: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
b4a0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63  }.    assert( pc
b4b0: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20  >=iCellFirst && 
b4c0: 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc<=iCellLast );
b4d0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67  .    size = pPag
b4e0: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
b4f0: 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20  ge, &src[pc]);. 
b500: 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b     cbrk -= size;
b510: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
b520: 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73  ellFirst || pc+s
b530: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
b540: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
b550: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b560: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  PT;.    }.    as
b570: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
b580: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
b590: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
b5a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b5b0: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
b5c0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
b5d0: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
b5e0: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
b5f0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
b600: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66  r, cbrk);.    if
b610: 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20  ( temp==0 ){.   
b620: 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20     int x;.      
b630: 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63  if( cbrk==pc ) c
b640: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74  ontinue;.      t
b650: 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  emp = sqlite3Pag
b660: 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67  erTempSpace(pPag
b670: 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  e->pBt->pPager);
b680: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
b690: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b6a0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
b6b0: 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b  &temp[x], &data[
b6c0: 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20  x], (cbrk+size) 
b6d0: 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20  - x);.      src 
b6e0: 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20  = temp;.    }.  
b6f0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
b700: 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20  brk], &src[pc], 
b710: 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73  size);.  }.  ass
b720: 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  ert( cbrk>=iCell
b730: 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62  First );.  put2b
b740: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b750: 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b  , cbrk);.  data[
b760: 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+1] = 0;.  da
b770: 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20  ta[hdr+2] = 0;. 
b780: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
b790: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
b7a0: 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c  [iCellFirst], 0,
b7b0: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
b7c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b7d0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
b7e0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
b7f0: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62  age) );.  if( cb
b800: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70  rk-iCellFirst!=p
b810: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
b820: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b830: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
b850: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b860: 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d  Search the free-
b870: 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67  list on page pPg
b880: 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74   for space to st
b890: 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65  ore a cell nByte
b8a0: 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a   bytes in.** siz
b8b0: 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65  e. If one can be
b8c0: 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61   found, return a
b8d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
b8e0: 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65  space and remove
b8f0: 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   it.** from the 
b900: 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
b910: 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20   If no suitable 
b920: 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75  space can be fou
b930: 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  nd on the free-l
b940: 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ist, return NULL
b950: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
b960: 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74  ction may detect
b970: 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68   corruption with
b980: 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72  in pPg.  If corr
b990: 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74  uption is.** det
b9a0: 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20  ected then *pRc 
b9b0: 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
b9c0: 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c  _CORRUPT and NUL
b9d0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
b9e0: 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68  *.** Slots on th
b9f0: 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74  e free list that
ba00: 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61   are between 1 a
ba10: 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65  nd 3 bytes large
ba20: 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20  r than nByte.** 
ba30: 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20  will be ignored 
ba40: 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78  if adding the ex
ba50: 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65  tra space to the
ba60: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
ba70: 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74  ount.** causes t
ba80: 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e  he fragmentation
ba90: 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64   count to exceed
baa0: 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75   60..*/.static u
bab0: 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  8 *pageFindSlot(
bac0: 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e  MemPage *pPg, in
bad0: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52  t nByte, int *pR
bae0: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  c){.  const int 
baf0: 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66  hdr = pPg->hdrOf
bb00: 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  fset;.  u8 * con
bb10: 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
bb20: 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64  aData;.  int iAd
bb30: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
bb40: 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74  int pc = get2byt
bb50: 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29  e(&aData[iAddr])
bb60: 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74  ;.  int x;.  int
bb70: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
bb80: 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
bb90: 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ze;..  assert( p
bba0: 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  c>0 );.  do{.   
bbb0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
bbc0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
bbd0: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
bbe0: 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  /.    /* EVIDENC
bbf0: 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39  E-OF: R-06866-39
bc00: 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61  125 Freeblocks a
bc10: 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63  re always connec
bc20: 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a  ted in order of.
bc30: 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e      ** increasin
bc40: 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20  g offset. */.   
bc50: 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69   if( pc>usableSi
bc60: 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72  ze-4 || pc<iAddr
bc70: 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  +4 ){.      *pRc
bc80: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
bc90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
bca0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
bcb0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
bcc0: 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20  : R-22710-53328 
bcd0: 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f  The third and fo
bce0: 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61  urth bytes of ea
bcf0: 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  ch.    ** freebl
bd00: 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65  ock form a big-e
bd10: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
bd20: 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20  ich is the size 
bd30: 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  of the freeblock
bd40: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73  .    ** in bytes
bd50: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
bd60: 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a  4-byte header. *
bd70: 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74  /.    size = get
bd80: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
bd90: 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20  2]);.    if( (x 
bda0: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e  = size - nByte)>
bdb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  =0 ){.      test
bdc0: 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20  case( x==4 );.  
bdd0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
bde0: 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =3 );.      if( 
bdf0: 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66  pc < pPg->cellOf
be00: 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c  fset+2*pPg->nCel
be10: 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75  l || size+pc > u
be20: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
be30: 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49       *pRc = SQLI
be40: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
be50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
be60: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
be70: 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( x<4 ){.      
be80: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
be90: 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20  : R-11498-58022 
bea0: 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
beb0: 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
bec0: 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20  e total.        
bed0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  ** number of byt
bee0: 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20  es in fragments 
bef0: 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36  may not exceed 6
bf00: 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  0. */.        if
bf10: 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35  ( aData[hdr+7]>5
bf20: 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  7 ) return 0;.. 
bf30: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
bf40: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
bf50: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
bf60: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
bf70: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
bf80: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
bf90: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
bfa0: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
bfb0: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
bfc0: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
bfd0: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
bfe0: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
bff0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c000: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74       /* The slot
c010: 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20   remains on the 
c020: 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63  free-list. Reduc
c030: 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63  e its size to ac
c040: 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a  count.         *
c050: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
c060: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
c070: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
c080: 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74  .        put2byt
c090: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20  e(&aData[pc+2], 
c0a0: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
c0b0: 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b    return &aData[
c0c0: 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20  pc + x];.    }. 
c0d0: 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20     iAddr = pc;. 
c0e0: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
c0f0: 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20  (&aData[pc]);.  
c100: 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20  }while( pc );.. 
c110: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
c120: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
c130: 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  te bytes of spac
c140: 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68  e from within th
c150: 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61  e B-Tree page pa
c160: 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
c170: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57  irst argument. W
c180: 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20  rite into *pIdx 
c190: 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70  the index into p
c1a0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a  Page->aData[].**
c1b0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
c1c0: 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  te of allocated 
c1d0: 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69  space. Return ei
c1e0: 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  ther SQLITE_OK o
c1f0: 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  r.** an error co
c200: 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49  de (usually SQLI
c210: 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a  TE_CORRUPT)..**.
c220: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75  ** The caller gu
c230: 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68  arantees that th
c240: 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e  ere is sufficien
c250: 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20  t space to make 
c260: 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  the.** allocatio
c270: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
c280: 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64   might need to d
c290: 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64  efragment in ord
c2a0: 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61  er to bring.** a
c2b0: 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67  ll the space tog
c2c0: 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20  ether, however. 
c2d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
c2e0: 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a  ll avoid using.*
c2f0: 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20  * the first two 
c300: 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63  bytes past the c
c310: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61  ell pointer area
c320: 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c   since presumabl
c330: 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61  y this.** alloca
c340: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61  tion is being ma
c350: 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  de in order to i
c360: 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
c370: 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20  , so we will.** 
c380: 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64  also end up need
c390: 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70  ing a new cell p
c3a0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
c3b0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
c3c0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
c3d0: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  ge, int nByte, i
c3e0: 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e  nt *pIdx){.  con
c3f0: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61  st int hdr = pPa
c400: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20  ge->hdrOffset;  
c410: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
c420: 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66   of pPage->hdrOf
c430: 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63  fset */.  u8 * c
c440: 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
c450: 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f  e->aData;      /
c460: 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66  * Local cache of
c470: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
c480: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
c4b0: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
c4c0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
c4d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
c4e0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
c4f0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
c500: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
c510: 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20   int gap;       
c520: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
c530: 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65  f gap between ce
c540: 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll pointers and 
c550: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
c560: 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c    .  assert( sql
c570: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
c580: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
c590: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
c5a0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
c5b0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c5c0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
c5d0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
c5e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
c5f0: 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e  te>=0 );  /* Min
c600: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
c610: 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s 4 */.  assert(
c620: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e   pPage->nFree>=n
c630: 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Byte );.  assert
c640: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
c650: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
c660: 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29  t( nByte < (int)
c670: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
c680: 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20  bleSize-8) );.. 
c690: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c6a0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
c6b0: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
c6c0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
c6d0: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
c6e0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
c6f0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
c700: 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  gap<=65536 );.  
c710: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
c720: 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66  R-29356-02391 If
c730: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
c740: 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20  es a 65536-byte 
c750: 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61  page size.  ** a
c760: 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20  nd the reserved 
c770: 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74  space is zero (t
c780: 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66  he usual value f
c790: 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63  or reserved spac
c7a0: 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  e).  ** then the
c7b0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
c7c0: 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79  fset of an empty
c7d0: 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62   page wants to b
c7e0: 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f  e 65536..  ** Ho
c7f0: 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65  wever, that inte
c800: 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  ger is too large
c810: 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e   to be stored in
c820: 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e   a 2-byte unsign
c830: 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c  ed.  ** integer,
c840: 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30   so a value of 0
c850: 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20   is used in its 
c860: 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20  place. */.  top 
c870: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c880: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65  [hdr+5]);.  asse
c890: 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50  rt( top<=(int)pP
c8a0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
c8b0: 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65  Size ); /* Preve
c8c0: 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74  nt by getAndInit
c8d0: 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20  Page() */.  if( 
c8e0: 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69  gap>top ){.    i
c8f0: 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61  f( top==0 && pPa
c900: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
c910: 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20  ize==65536 ){.  
c920: 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b      top = 65536;
c930: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c940: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c950: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
c960: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
c970: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
c980: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
c990: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
c9a0: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
c9b0: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
c9c0: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
c9d0: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
c9e0: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
c9f0: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
ca00: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
ca10: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
ca20: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
ca30: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
ca40: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
ca50: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
ca60: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
ca70: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
ca80: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
ca90: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
caa0: 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20  (data[hdr+2] || 
cab0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20  data[hdr+1]) && 
cac0: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
cad0: 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70    u8 *pSpace = p
cae0: 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67  ageFindSlot(pPag
caf0: 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a  e, nByte, &rc);.
cb00: 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29      if( pSpace )
cb10: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
cb20: 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20  pSpace>=data && 
cb30: 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c  (pSpace - data)<
cb40: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a  65536 );.      *
cb50: 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70  pIdx = (int)(pSp
cb60: 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20  ace - data);.   
cb70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cb80: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  _OK;.    }else i
cb90: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
cba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
cbb0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65    }..  /* The re
cbc0: 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20  quest could not 
cbd0: 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69  be fulfilled usi
cbe0: 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c  ng a freelist sl
cbf0: 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20  ot.  Check.  ** 
cc00: 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67  to see if defrag
cc10: 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63  mentation is nec
cc20: 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74  essary..  */.  t
cc30: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e  estcase( gap+2+n
cc40: 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69  Byte==top );.  i
cc50: 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74  f( gap+2+nByte>t
cc60: 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  op ){.    assert
cc70: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
cc80: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
cc90: 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61  ;.    rc = defra
cca0: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
ccb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
ccc0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
ccd0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
cce0: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ccf0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
cd00: 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  ap+nByte<=top );
cd10: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
cd20: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
cd30: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
cd40: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
cd50: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
cd60: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
cd70: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
cd80: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
cd90: 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79  call has already
cda0: 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20  .  ** validated 
cdb0: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47  the freelist.  G
cdc0: 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72  iven that the fr
cdd0: 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c  eelist is valid,
cde0: 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e   there.  ** is n
cdf0: 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61  o way that the a
ce00: 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78  llocation can ex
ce10: 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64  tend off the end
ce20: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20   of the page..  
ce30: 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20  ** The assert() 
ce40: 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
ce50: 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74  he previous sent
ce60: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  ence..  */.  top
ce70: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74   -= nByte;.  put
ce80: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ce90: 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65  5], top);.  asse
cea0: 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d  rt( top+nByte <=
ceb0: 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
cec0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
ced0: 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20    *pIdx = top;. 
cee0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
cef0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
cf00: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
cf10: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
cf20: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
cf30: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
cf40: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
cf50: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
cf60: 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74  ge->aData[iStart
cf70: 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a  ].** and the siz
cf80: 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69  e of the block i
cf90: 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a  s iSize bytes..*
cfa0: 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72  *.** Adjacent fr
cfb0: 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61  eeblocks are coa
cfc0: 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  lesced..**.** No
cfd0: 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f  te that even tho
cfe0: 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63  ugh the freebloc
cff0: 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b  k list was check
d000: 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50  ed by btreeInitP
d010: 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72  age(),.** that r
d020: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20  outine will not 
d030: 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62  detect overlap b
d040: 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20  etween cells or 
d050: 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72  freeblocks.  Nor
d060: 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65  .** does it dete
d070: 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  ct cells or free
d080: 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72  blocks that encr
d090: 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65  ouch into the re
d0a0: 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20  served bytes.** 
d0b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d0c0: 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61  e page.  So do a
d0d0: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70  dditional corrup
d0e0: 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69  tion checks insi
d0f0: 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  de this.** routi
d100: 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ne and return SQ
d110: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
d120: 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65  any problems are
d130: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
d140: 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28  c int freeSpace(
d150: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
d160: 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20  u16 iStart, u16 
d170: 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50  iSize){.  u16 iP
d180: 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tr;             
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74  /* Address of pt
d1b0: 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c  r to next freebl
d1c0: 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72  ock */.  u16 iFr
d1d0: 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20  eeBlk;          
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1f0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
d200: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
d210: 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20  */.  u8 hdr;    
d220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d230: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
d240: 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20  ge header size. 
d250: 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75   0 or 100 */.  u
d260: 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20  8 nFrag = 0;    
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f       /* Reductio
d290: 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69  n in fragmentati
d2a0: 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69  on */.  u16 iOri
d2b0: 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20  gSize = iSize;  
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d2d0: 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
d2e0: 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33  of iSize */.  u3
d2f0: 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d  2 iLast = pPage-
d300: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d310: 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70  -4; /* Largest p
d320: 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63  ossible freebloc
d330: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33  k offset */.  u3
d340: 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  2 iEnd = iStart 
d350: 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  + iSize;        
d360: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
d370: 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72  e past the iStar
d380: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
d390: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
d3a0: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
d3b0: 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74  ;   /* Page cont
d3c0: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
d3d0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
d3e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d3f0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
d400: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
d410: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
d420: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
d430: 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
d440: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
d450: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
d460: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
d470: 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
d480: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
d490: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
d4a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d4b0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
d4c0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d4d0: 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
d4e0: 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
d4f0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
d500: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
d510: 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a  tart<=iLast );..
d520: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
d530: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
d540: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
d550: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
d560: 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e  lete.  ** option
d570: 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20   is enabled */. 
d580: 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
d590: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
d5a0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
d5b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
d5c0: 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
d5d0: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
d5e0: 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65  The list of free
d5f0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
d600: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
d610: 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20  r.  Find the .  
d620: 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c  ** spot on the l
d630: 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74  ist where iStart
d640: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
d650: 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20  ted..  */.  hdr 
d660: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
d670: 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72  et;.  iPtr = hdr
d680: 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61   + 1;.  if( data
d690: 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64  [iPtr+1]==0 && d
d6a0: 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a  ata[iPtr]==0 ){.
d6b0: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30      iFreeBlk = 0
d6c0: 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66  ;  /* Shortcut f
d6d0: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
d6e0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
d6f0: 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73   empty */.  }els
d700: 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69  e{.    while( (i
d710: 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79  FreeBlk = get2by
d720: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29  te(&data[iPtr]))
d730: 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69  >0 && iFreeBlk<i
d740: 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69  Start ){.      i
d750: 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72  f( iFreeBlk<iPtr
d760: 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +4 ) return SQLI
d770: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d780: 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46  .      iPtr = iF
d790: 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20  reeBlk;.    }.  
d7a0: 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69    if( iFreeBlk>i
d7b0: 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51  Last ) return SQ
d7c0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d7d0: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  T;.    assert( i
d7e0: 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20  FreeBlk>iPtr || 
d7f0: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20  iFreeBlk==0 );. 
d800: 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73   .    /* At this
d810: 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20   point:.    **  
d820: 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69    iFreeBlk:   Fi
d830: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66  rst freeblock af
d840: 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a  ter iStart, or z
d850: 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20  ero if none.    
d860: 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20  **    iPtr:     
d870: 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66    The address of
d880: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46   a pointer to iF
d890: 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20  reeBlk.    **.  
d8a0: 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
d8b0: 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68  e if iFreeBlk sh
d8c0: 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65  ould be coalesce
d8d0: 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  d onto the end o
d8e0: 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f  f iStart..    */
d8f0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
d900: 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72  k && iEnd+3>=iFr
d910: 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e  eeBlk ){.      n
d920: 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20  Frag = iFreeBlk 
d930: 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66  - iEnd;.      if
d940: 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20  ( iEnd>iFreeBlk 
d950: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d960: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d970: 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65      iEnd = iFree
d980: 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26  Blk + get2byte(&
d990: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d  data[iFreeBlk+2]
d9a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  );.      if( iEn
d9b0: 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  d > pPage->pBt->
d9c0: 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74  usableSize ) ret
d9d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d9e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
d9f0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53  Size = iEnd - iS
da00: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65  tart;.      iFre
da10: 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28  eBlk = get2byte(
da20: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29  &data[iFreeBlk])
da30: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
da40: 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f  * If iPtr is ano
da50: 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28  ther freeblock (
da60: 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72  that is, if iPtr
da70: 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65   is not the free
da80: 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  list.    ** poin
da90: 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20  ter in the page 
daa0: 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65  header) then che
dab0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74  ck to see if iSt
dac0: 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20  art should be.  
dad0: 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f    ** coalesced o
dae0: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69  nto the end of i
daf0: 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  Ptr..    */.    
db00: 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29  if( iPtr>hdr+1 )
db10: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72  {.      int iPtr
db20: 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74  End = iPtr + get
db30: 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72  2byte(&data[iPtr
db40: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
db50: 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72  iPtrEnd+3>=iStar
db60: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
db70: 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20   iPtrEnd>iStart 
db80: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
db90: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
dba0: 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69        nFrag += i
dbb0: 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b  Start - iPtrEnd;
dbc0: 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d  .        iSize =
dbd0: 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20   iEnd - iPtr;.  
dbe0: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
dbf0: 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Ptr;.      }.   
dc00: 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67   }.    if( nFrag
dc10: 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72  >data[hdr+7] ) r
dc20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dc30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64  RUPT_BKPT;.    d
dc40: 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46  ata[hdr+7] -= nF
dc50: 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  rag;.  }.  if( i
dc60: 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28  Start==get2byte(
dc70: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b  &data[hdr+5]) ){
dc80: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
dc90: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20  freeblock is at 
dca0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
dcb0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
dcc0: 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73  t area,.    ** s
dcd0: 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68  o just extend th
dce0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
dcf0: 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20  rea rather than 
dd00: 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20  create another. 
dd10: 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65     ** freelist e
dd20: 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  ntry */.    if( 
dd30: 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
dd40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dd50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75  UPT_BKPT;.    pu
dd60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
dd70: 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  +1], iFreeBlk);.
dd80: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
dd90: 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29  ta[hdr+5], iEnd)
dda0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
ddb0: 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
ddc0: 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20   freeblock into 
ddd0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
dde0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
ddf0: 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74  ta[iPtr], iStart
de00: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
de10: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69  &data[iStart], i
de20: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
de30: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
de40: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
de50: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72    }.  pPage->nFr
de60: 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b  ee += iOrigSize;
de70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
de80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
de90: 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62  code the flags b
dea0: 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62  yte (the first b
deb0: 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  yte of the heade
dec0: 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a  r) for a page.**
ded0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
dee0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65  fields of the Me
def0: 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20  mPage structure 
df00: 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a  accordingly..**.
df10: 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c  ** Only the foll
df20: 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f  owing combinatio
df30: 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64  ns are supported
df40: 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66  .  Anything diff
df50: 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74  erent.** indicat
df60: 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  es a corrupt dat
df70: 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a  abase files:.**.
df80: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a  **         PTF_Z
df90: 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20  ERODATA.**      
dfa0: 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20     PTF_ZERODATA 
dfb0: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20  | PTF_LEAF.**   
dfc0: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
dfd0: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a  TA | PTF_INTKEY.
dfe0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
dff0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
e000: 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a  TKEY | PTF_LEAF.
e010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
e020: 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67  codeFlags(MemPag
e030: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
e040: 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61  agByte){.  BtSha
e050: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a  red *pBt;     /*
e060: 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65   A copy of pPage
e070: 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ->pBt */..  asse
e080: 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt( pPage->hdrOf
e090: 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67  fset==(pPage->pg
e0a0: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29  no==1 ? 100 : 0)
e0b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e0c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
e0d0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
e0e0: 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
e0f0: 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67  leaf = (u8)(flag
e100: 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72  Byte>>3);  asser
e110: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
e120: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
e130: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
e140: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
e150: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
e160: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65  e->leaf;.  pPage
e170: 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
e180: 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74  llSizePtr;.  pBt
e190: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
e1a0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28   if( flagByte==(
e1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
e1c0: 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20  TF_INTKEY) ){.  
e1d0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
e1e0: 3a 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35 20  : R-03640-13415 
e1f0: 41 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65 61  A value of 5 mea
e200: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
e210: 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a  n interior.    *
e220: 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70  * table b-tree p
e230: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e240: 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54  rt( (PTF_LEAFDAT
e250: 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35  A|PTF_INTKEY)==5
e260: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
e270: 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31 2d  NCE-OF: R-20501-
e280: 36 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f 66  61796 A value of
e290: 20 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70 61   13 means the pa
e2a0: 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20  ge is a leaf.   
e2b0: 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65   ** table b-tree
e2c0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e2d0: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
e2e0: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ATA|PTF_INTKEY|P
e2f0: 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a  TF_LEAF)==13 );.
e300: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e310: 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  y = 1;.    if( p
e320: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
e330: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e340: 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20  yLeaf = 1;.     
e350: 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61   pPage->noPayloa
e360: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  d = 0;.      pPa
e370: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
e380: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
e390: 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  tr;.    }else{. 
e3a0: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
e3b0: 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  eyLeaf = 0;.    
e3c0: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
e3d0: 61 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  ad = 1;.      pP
e3e0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
e3f0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
e400: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
e410: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
e420: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
e430: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
e440: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
e450: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
e460: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
e470: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e480: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
e490: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
e4a0: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
e4b0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e4c0: 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33 39  -OF: R-27225-539
e4d0: 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  36 A value of 2 
e4e0: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
e4f0: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
e500: 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65    ** index b-tre
e510: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
e520: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
e530: 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20  DATA)==2 );.    
e540: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
e550: 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41 20  R-16571-11615 A 
e560: 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61 6e  value of 10 mean
e570: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20  s the page is a 
e580: 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65  leaf.    ** inde
e590: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
e5a0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e5b0: 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
e5c0: 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
e5d0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
e5e0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
e5f0: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
e600: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
e610: 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  oad = 0;.    pPa
e620: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
e630: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
e640: 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50 61  trIndex;.    pPa
e650: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
e660: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
e670: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
e680: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
e690: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
e6a0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
e6b0: 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41 6e  R-47608-56469 An
e6c0: 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66 6f  y other value fo
e6d0: 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  r the b-tree pag
e6e0: 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a 2a  e type is.    **
e6f0: 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20   an error. */.  
e700: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e710: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
e720: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
e730: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
e740: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
e750: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
e760: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
e770: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
e780: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
e790: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
e7a0: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
e7b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
e7c0: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
e7d0: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
e7e0: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
e7f0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
e800: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
e810: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
e820: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
e830: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
e840: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
e850: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
e860: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
e870: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
e880: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
e890: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
e8a0: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
e8b0: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
e8c0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
e8d0: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
e8e0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
e8f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
e900: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
e910: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
e920: 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t->db!=0 );.  as
e930: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e940: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
e950: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e960: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e970: 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
e980: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
e990: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
e9a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
e9b0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
e9c0: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
e9d0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
e9e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
e9f0: 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  a == sqlite3Page
ea00: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
ea10: 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69  pDbPage) );..  i
ea20: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
ea30: 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b  t ){.    u16 pc;
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ea50: 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
ea60: 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
ea70: 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
ea80: 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20     u8 hdr;      
ea90: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
eaa0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
eab0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
eac0: 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20     u8 *data;    
ead0: 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74        /* Equal t
eae0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  o pPage->aData *
eaf0: 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  /.    BtShared *
eb00: 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  pBt;        /* T
eb10: 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74  he main btree st
eb20: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69  ructure */.    i
eb30: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
eb40: 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75    /* Amount of u
eb50: 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65  sable space on e
eb60: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ach page */.    
eb70: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
eb80: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
eb90: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
eba0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
ebb0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  inter */.    int
ebc0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
ebd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75  /* Number of unu
ebe0: 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  sed bytes on the
ebf0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
ec00: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
ec10: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
ec20: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ec30: 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e  t area */.    in
ec40: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
ec50: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
ec60: 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
ec70: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
ec80: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73      int iCellLas
ec90: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
eca0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
ecb0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
ecc0: 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70   */..    pBt = p
ecd0: 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20  Page->pBt;..    
ece0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
ecf0: 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61  Offset;.    data
ed00: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
ed10: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
ed20: 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
ed30: 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
ed40: 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
ed50: 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20 20   indicating.    
ed60: 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  ** the b-tree pa
ed70: 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20  ge type. */.    
ed80: 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28  if( decodeFlags(
ed90: 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d  pPage, data[hdr]
eda0: 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
edb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
edc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
edd0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
ede0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
edf0: 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50  =65536 );.    pP
ee00: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
ee10: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
ee20: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50  ize - 1);.    pP
ee30: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
ee40: 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
ee50: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
ee60: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
ee70: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
ee80: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
ee90: 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c   8 + pPage->chil
eea0: 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 50  dPtrSize;.    pP
eeb0: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
eec0: 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
eed0: 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 43  ];.    pPage->aC
eee0: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63  ellIdx = &data[c
eef0: 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  ellOffset];.    
ef00: 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
ef10: 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
ef20: 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
ef30: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
ef40: 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35  F: R-58015-48175
ef50: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
ef60: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
ef70: 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20  5 designates.   
ef80: 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
ef90: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
efa0: 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
efb0: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
efc0: 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20  teger is.    ** 
efd0: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36  interpreted as 6
efe0: 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70  5536. */.    top
eff0: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
f000: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
f010: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f020: 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32  E-OF: R-37002-32
f030: 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65  774 The two-byte
f040: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f050: 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20  et 3 gives the. 
f060: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
f070: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
f080: 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d  e. */.    pPage-
f090: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
f0a0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
f0b0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
f0c0: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
f0d0: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
f0e0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
f0f0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
f100: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
f110: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
f120: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f130: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f140: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
f150: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
f160: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
f170: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f180: 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39  -OF: R-24089-579
f190: 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e  79 If a page con
f1a0: 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28  tains no cells (
f1b0: 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20  which is only.  
f1c0: 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f    ** possible fo
f1d0: 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  r a root page of
f1e0: 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f   a table that co
f1f0: 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20  ntains no rows) 
f200: 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
f210: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  offset to the ce
f220: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
f230: 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70  will equal the p
f240: 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74  age size minus t
f250: 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20  he.    ** bytes 
f260: 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
f270: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f280: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
f290: 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53   || top==usableS
f2a0: 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ize || CORRUPT_D
f2b0: 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d  B );..    /* A m
f2c0: 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  alformed databas
f2d0: 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75  e page might cau
f2e0: 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61  se us to read pa
f2f0: 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a  st the end.    *
f300: 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
f310: 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
f320: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
f330: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
f340: 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b  ck of code check
f350: 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69  s early to see i
f360: 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73  f a cell extends
f370: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
f380: 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62   end of a page b
f390: 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73  oundary and caus
f3a0: 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  es SQLITE_CORRUP
f3b0: 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  T to be .    ** 
f3c0: 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64  returned if it d
f3d0: 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oes..    */.    
f3e0: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
f3f0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
f400: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43  e->nCell;.    iC
f410: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
f420: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69 66  Size - 4;.    if
f430: 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
f440: 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
f450: 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e  zeCk ){.      in
f460: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
f470: 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
f480: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
f490: 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e  rray */.      in
f4a0: 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  t sz;           
f4b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c  /* Size of a cel
f4c0: 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  l */..      if( 
f4d0: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
f4e0: 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20  CellLast--;.    
f4f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
f500: 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
f510: 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65  .        pc = ge
f520: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 64  t2byteAligned(&d
f530: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69  ata[cellOffset+i
f540: 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *2]);.        te
f550: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
f560: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20  lFirst );.      
f570: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
f580: 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20  iCellLast );.   
f590: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
f5a0: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
f5b0: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
f5c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f5d0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f5e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f5f0: 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43    sz = pPage->xC
f600: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
f610: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
f620: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
f630: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
f640: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
f650: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
f660: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
f670: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f680: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
f690: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
f6a0: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f6b0: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
f6c0: 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20      }  ..    /* 
f6d0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
f6e0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
f6f0: 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  the page.    ** 
f700: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
f710: 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20 74  3588-34450 The t
f720: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
f730: 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76 65  at offset 1 give
f740: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
f750: 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  rt of the first 
f760: 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65  freeblock on the
f770: 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65 72   page, or is zer
f780: 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  o if there are n
f790: 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  o.    ** freeblo
f7a0: 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d  cks. */.    pc =
f7b0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
f7c0: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
f7d0: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
f7e0: 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
f7f0: 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
f800: 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
f810: 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  ce */.    while(
f820: 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 75   pc>0 ){.      u
f830: 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20  16 next, size;. 
f840: 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
f850: 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
f860: 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
f870: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f880: 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
f890: 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
f8a0: 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
f8b0: 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  ere will.       
f8c0: 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
f8d0: 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
f8e0: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
f8f0: 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
f900: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
f910: 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62 6c  * Or, the freebl
f920: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 65  ock is off the e
f930: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a 20  nd of the page. 
f940: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
f950: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f960: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
f970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78       }.      nex
f980: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
f990: 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73  ta[pc]);.      s
f9a0: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
f9b0: 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20  data[pc+2]);.   
f9c0: 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26     if( (next>0 &
f9d0: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
f9e0: 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  3) || pc+size>us
f9f0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
fa00: 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63      /* Free bloc
fa10: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
fa20: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41  cending order. A
fa30: 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  nd the last byte
fa40: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   of.        ** t
fa50: 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75  he free-block mu
fa60: 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61  st lie on the da
fa70: 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f  tabase page.  */
fa80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
fa90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
faa0: 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  KPT; .      }.  
fab0: 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
fac0: 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
fad0: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
fae0: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
faf0: 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f   point, nFree co
fb00: 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f  ntains the sum o
fb10: 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  f the offset to 
fb20: 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  the start.    **
fb30: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
fb40: 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74  tent area plus t
fb50: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
fb60: 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20  e bytes within. 
fb70: 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63     ** the cell-c
fb80: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20  ontent area. If 
fb90: 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20  this is greater 
fba0: 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d  than the usable-
fbb0: 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74  size.    ** of t
fbc0: 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
fbd0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
fbe0: 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63  orrupted. This c
fbf0: 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a  heck also.    **
fc00: 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66   serves to verif
fc10: 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65  y that the offse
fc20: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  t to the start o
fc30: 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65  f the cell-conte
fc40: 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20  nt.    ** area, 
fc50: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
fc60: 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
fc70: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
fc80: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
fc90: 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53  f( nFree>usableS
fca0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
fcb0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fcc0: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a  PT_BKPT; .    }.
fcd0: 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
fce0: 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d   = (u16)(nFree -
fcf0: 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20   iCellFirst);.  
fd00: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
fd10: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
fd20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fd30: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
fd40: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
fd50: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
fd60: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
fd70: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
fd80: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
fd90: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
fda0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
fdb0: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
fdc0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
fdd0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
fde0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
fdf0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
fe00: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
fe10: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
fe20: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
fe30: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
fe40: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
fe50: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
fe60: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
fe70: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
fe80: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
fe90: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
fea0: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
feb0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
fec0: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
fed0: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
fee0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fef0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
ff00: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
ff10: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
ff20: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ff30: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
ff40: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
ff50: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
ff60: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
ff70: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
ff80: 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
ff90: 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
ffa0: 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
ffb0: 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
ffc0: 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
ffd0: 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
ffe0: 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
fff0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
10000 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
10010 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
10020 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
10030 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
10040 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
10050 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
10060 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
10070 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
10080 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
10090 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
100a0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
100b0 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
100c0 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
100d0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
100e0 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
100f0 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
10100 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  rst];.  pPage->a
10110 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61  DataOfst = &data
10120 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
10130 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
10140 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
10150 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
10160 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
10170 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
10180 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
10190 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
101a0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
101b0 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
101c0 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
101d0 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
101e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
101f0 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
10200 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
10210 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
10220 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
10230 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
10240 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
10250 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
10260 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
10270 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
10280 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10290 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
102a0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
102b0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
102c0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
102d0 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
102e0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
102f0 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
10300 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
10310 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
10320 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
10330 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
10340 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
10350 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31  et = pgno==1 ? 1
10360 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  00 : 0;.  return
10370 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a   pPage; .}../*.*
10380 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
10390 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e  m the pager.  In
103a0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
103b0 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
103c0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
103d0 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
103e0 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72  .  See also: btr
103f0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
10400 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
10410 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
10420 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ENT flag is set,
10430 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
10440 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a  e do not care.**
10450 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
10460 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
10470 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
10480 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
10490 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
104a0 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
104b0 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
104c0 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
104d0 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
104e0 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
104f0 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
10500 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
10510 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
10520 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
10530 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
10540 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
10550 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
10560 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
10570 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
10580 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
10590 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50  ic int btreeGetP
105a0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
105b0 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
105c0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
105d0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
105e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
105f0 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
10600 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
10610 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
10620 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
10630 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
10640 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
10650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
10660 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
10670 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
10680 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
10690 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
106a0 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
106b0 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c  sert( flags==0 |
106c0 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
106d0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20  ET_NOCONTENT || 
106e0 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
106f0 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61  _READONLY );.  a
10700 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10710 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10720 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
10730 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
10740 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ire(pBt->pPager,
10750 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
10760 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73  )&pDbPage, flags
10770 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
10780 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
10790 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
107a0 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
107b0 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
107c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
107d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
107e0 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
107f0 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
10800 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
10810 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
10820 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
10830 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
10840 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
10850 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
10860 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
10870 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
10880 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
10890 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
108a0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
108b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
108c0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
108d0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
108e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
108f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
10900 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
10910 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
10920 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
10930 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
10940 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
10950 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
10960 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
10970 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
10980 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
10990 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
109a0 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
109b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
109c0 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
109d0 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
109e0 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
109f0 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
10a00 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
10a10 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
10a20 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
10a30 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
10a40 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
10a50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
10a60 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
10a70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10a80 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
10a90 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
10aa0 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
10ab0 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20  )&0x8000000)==0 
10ac0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65  );.  return btre
10ad0 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42  ePagecount(p->pB
10ae0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  t);.}../*.** Get
10af0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
10b00 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69   pager and initi
10b10 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  alize it..**.** 
10b20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20  If pCur!=0 then 
10b30 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e  the page is bein
10b40 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72  g fetched as par
10b50 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69  t of a moveToChi
10b60 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44  ld().** call.  D
10b70 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  o additional san
10b80 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  ity checking on 
10b90 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
10ba0 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66   case..** And if
10bb0 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73   the fetch fails
10bc0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  , this routine m
10bd0 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43  ust decrement pC
10be0 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a  ur->iPage..**.**
10bf0 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74   The page is fet
10c00 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69  ched as read-wri
10c10 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69  te unless pCur i
10c20 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69  s not NULL and i
10c30 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79  s.** a read-only
10c40 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
10c50 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
10c60 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20  s, then *ppPage 
10c70 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74  is undefined. It
10c80 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75  .** may remain u
10c90 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20  nchanged, or it 
10ca0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e  may be set to an
10cb0 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a   invalid value..
10cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
10cd0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20  tAndInitPage(.  
10ce0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
10cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d00 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
10d10 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
10d20 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  gno,            
10d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10d40 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
10d50 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
10d60 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
10d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
10d80 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
10d90 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20  inter here */.  
10da0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10dc0 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63  /* Cursor to rec
10dd0 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f  eive the page, o
10de0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  r NULL */.  int 
10df0 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20  bReadOnly       
10e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
10e10 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f  rue for a read-o
10e20 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  nly page */.){. 
10e30 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
10e40 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
10e50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10e60 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
10e70 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
10e80 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50  ( pCur==0 || ppP
10e90 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50 61  age==&pCur->apPa
10ea0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
10eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
10ec0 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c  r==0 || bReadOnl
10ed0 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65  y==pCur->curPage
10ee0 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65  rFlags );.  asse
10ef0 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
10f00 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
10f10 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
10f20 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
10f30 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
10f40 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
10f50 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
10f60 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a  InitPage_error;.
10f70 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
10f80 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70  e3PagerAcquire(p
10f90 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
10fa0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
10fb0 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29  Page, bReadOnly)
10fc0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
10fd0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
10fe0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
10ff0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
11000 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
11010 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
11020 70 42 74 29 3b 0a 20 20 69 66 28 20 28 2a 70 70  pBt);.  if( (*pp
11030 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
11040 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
11050 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61  eeInitPage(*ppPa
11060 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
11070 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11080 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11090 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
110a0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
110b0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  age_error;.    }
110c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 62  .  }..  /* If ob
110d0 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20  taining a child 
110e0 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f  page for a curso
110f0 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66  r, we must verif
11100 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  y that the page 
11110 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62  is.  ** compatib
11120 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74  le with the root
11130 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20   page. */.  if( 
11140 70 43 75 72 0a 20 20 20 26 26 20 28 28 2a 70 70  pCur.   && ((*pp
11150 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  Page)->nCell<1 |
11160 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74  | (*ppPage)->int
11170 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key!=pCur->curIn
11180 74 4b 65 79 29 0a 20 20 29 7b 0a 20 20 20 20 72  tKey).  ){.    r
11190 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
111a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c  PT_BKPT;.    rel
111b0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
111c0 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  );.    goto getA
111d0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
111e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
111f0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e  QLITE_OK;..getAn
11200 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a  dInitPage_error:
11210 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70 43  .  if( pCur ) pC
11220 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74  ur->iPage--;.  t
11230 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
11240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
11250 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
11260 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
11270 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11280 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
11290 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
112a0 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
112b0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
112c0 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
112d0 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73  reeGetPage..*/.s
112e0 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
112f0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
11300 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
11310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
11320 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
11330 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
11340 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11350 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
11360 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11370 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
11380 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
11390 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
113a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
113b0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
113c0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
113d0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
113e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
113f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
11400 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
11410 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
11420 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
11430 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
11440 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
11450 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
11460 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
11470 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65   pPage ) release
11480 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
11490 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e);.}../*.** Get
114a0 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e   an unused page.
114b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
114c0 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65  s just like btre
114d0 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20  eGetPage() with 
114e0 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a  the addition:.**
114f0 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20  .**   *  If the 
11500 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
11510 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20  in use for some 
11520 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69  other purpose, i
11530 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
11540 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e     release it an
11550 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  d return an SQLI
11560 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72  TE_CURRUPT error
11570 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73  ..**   *  Make s
11580 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66  ure the isInit f
11590 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a  lag is clear.*/.
115a0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
115b0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20  GetUnusedPage(. 
115c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
115d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
115e0 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
115f0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
11600 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
11610 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
11620 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
11630 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
11640 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
11650 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
11660 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
11670 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
11680 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
11690 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
116a0 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
116b0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
116c0 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
116d0 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
116e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
116f0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
11700 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
11710 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
11720 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
11730 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
11740 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
11750 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
11760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
11770 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11780 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
11790 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
117a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
117b0 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
117c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
117d0 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
117e0 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
117f0 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
11800 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
11810 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
11820 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
11830 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
11840 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
11850 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
11860 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
11870 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
11880 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
11890 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
118a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
118b0 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
118c0 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
118d0 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
118e0 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
118f0 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
11900 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
11910 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
11920 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
11930 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
11940 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11950 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
11960 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
11970 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
11980 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
11990 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
119a0 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
119b0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
119c0 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
119d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
119e0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
119f0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11a00 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
11a10 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
11a20 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
11a30 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
11a40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
11a50 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
11a60 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
11a70 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
11a80 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
11a90 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
11aa0 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
11ab0 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
11ac0 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
11ad0 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
11ae0 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
11af0 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
11b00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11b10 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
11b20 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
11b30 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
11b40 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
11b50 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
11b60 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
11b70 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
11b80 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
11b90 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
11ba0 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
11bb0 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
11bc0 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
11bd0 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
11be0 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
11bf0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
11c00 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
11c10 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
11c20 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
11c30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
11c40 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
11c50 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
11c60 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
11c70 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
11c80 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
11c90 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
11ca0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11cb0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
11cc0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
11cd0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
11ce0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
11cf0 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
11d00 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
11d10 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
11d20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
11d30 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
11d40 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
11d50 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
11d60 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
11d70 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65  * then an epheme
11d80 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20  ral database is 
11d90 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65 70  created.  The ep
11da0 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
11db0 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63   might.** be exc
11dc0 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f  lusively in memo
11dd0 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20  ry, or it might 
11de0 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64  use a disk-based
11df0 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a   memory cache..*
11e00 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  * Either way, th
11e10 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
11e20 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74  base will be aut
11e30 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
11e40 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69  ed .** when sqli
11e50 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20  te3BtreeClose() 
11e60 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
11e70 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
11e80 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
11e90 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
11ea0 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
11eb0 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
11ec0 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
11ed0 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
11ee0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
11ef0 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65  e "flags" parame
11f00 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b  ter is a bitmask
11f10 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74   that might cont
11f20 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a  ain bits like.**
11f30 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52   BTREE_OMIT_JOUR
11f40 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45  NAL and/or BTREE
11f50 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49  _MEMORY..**.** I
11f60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
11f70 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
11f80 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
11f90 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11fa0 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69  .** and we are i
11fb0 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d  n shared cache m
11fc0 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70  ode, then the op
11fd0 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  en will fail wit
11fe0 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  h an.** SQLITE_C
11ff0 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e  ONSTRAINT error.
12000 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f    We cannot allo
12010 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74  w two or more Bt
12020 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74  Shared.** object
12030 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  s in the same da
12040 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
12050 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f  n since doing so
12060 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f   will lead.** to
12070 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c   problems with l
12080 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ocking..*/.int s
12090 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28  qlite3BtreeOpen(
120a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
120b0 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46  pVfs,      /* VF
120c0 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
120d0 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f  s b-tree */.  co
120e0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
120f0 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
12100 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
12110 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
12120 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
12130 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
12140 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
12150 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
12160 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
12170 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
12180 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
12190 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
121a0 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
121b0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
121c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
121d0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
121e0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
121f0 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
12200 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
12210 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
12220 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
12230 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
12240 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
12250 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
12260 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
12270 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
12280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12290 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
122a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
122b0 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
122c0 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
122d0 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
122e0 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
122f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
12300 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
12310 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12320 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
12330 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
12340 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
12350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
12360 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
12370 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
12380 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
12390 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
123a0 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
123b0 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
123c0 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f  ..  /* True if o
123d0 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65  pening an epheme
123e0 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64  ral, temporary d
123f0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
12400 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20  st int isTempDb 
12410 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c  = zFilename==0 |
12420 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d  | zFilename[0]==
12430 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
12440 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64   variable isMemd
12450 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e  b to true for an
12460 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
12470 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61  ase, or .  ** fa
12480 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62  lse for a file-b
12490 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  ased database.. 
124a0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
124b0 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
124c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
124d0 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20  mdb = 0;.#else. 
124e0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
124f0 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20  db = (zFilename 
12500 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  && strcmp(zFilen
12510 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29  ame, ":memory:")
12520 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
12530 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
12540 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69  isTempDb && sqli
12550 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
12560 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  db)).           
12570 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28              || (
12580 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12590 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d  E_OPEN_MEMORY)!=
125a0 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  0;.#endif..  ass
125b0 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
125c0 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
125d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
125e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
125f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
12600 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
12610 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
12620 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
12630 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
12640 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
12650 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
12660 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
12670 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
12680 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
12690 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
126a0 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
126b0 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
126c0 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
126d0 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
126e0 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
126f0 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
12700 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
12710 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
12720 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
12730 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
12740 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
12750 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
12760 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
12770 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
12780 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
12790 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
127a0 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
127b0 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
127c0 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
127d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
127e0 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
127f0 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
12800 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
12810 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
12820 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
12830 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12840 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
12850 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
12860 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
12870 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
12880 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
12890 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
128a0 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
128b0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
128c0 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
128d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
128e0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
128f0 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
12900 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
12910 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
12920 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
12930 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
12940 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
12950 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
12960 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
12970 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
12980 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
12990 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d    */.  if( isTem
129a0 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d  pDb==0 && (isMem
129b0 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61  db==0 || (vfsFla
129c0 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  gs&SQLITE_OPEN_U
129d0 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69  RI)!=0) ){.    i
129e0 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53 51  f( vfsFlags & SQ
129f0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
12a00 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69  CACHE ){.      i
12a10 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  nt nFilename = s
12a20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12a30 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20  Filename)+1;.   
12a40 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
12a50 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
12a60 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
12a70 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
12a80 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
12a90 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61  lloc(MAX(nFullPa
12aa0 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65  thname,nFilename
12ab0 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f  ));.      MUTEX_
12ac0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
12ad0 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
12ae0 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73  d; )..      p->s
12af0 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
12b00 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
12b10 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
12b20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
12b30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
12b40 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12b60 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
12b70 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
12b80 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
12b90 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b  ame, nFilename);
12ba0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12bb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12bc0 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
12bd0 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
12be0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61       nFullPathna
12c10 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
12c20 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
12c30 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
12c40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
12c50 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
12c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12c70 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
12c80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
12ca0 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
12cb0 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78  SAFE.      mutex
12cc0 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75  Open = sqlite3Mu
12cd0 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
12ce0 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45  MUTEX_STATIC_OPE
12cf0 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  N);.      sqlite
12d00 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
12d10 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  texOpen);.      
12d20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
12d30 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
12d40 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
12d50 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
12d60 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12d70 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
12d80 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
12d90 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c    for(pBt=GLOBAL
12da0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
12db0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12dc0 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74  t); pBt; pBt=pBt
12dd0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
12de0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
12df0 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20  Ref>0 );.       
12e00 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a   if( 0==strcmp(z
12e10 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71  FullPathname, sq
12e20 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
12e30 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  me(pBt->pPager, 
12e40 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0)).            
12e50 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
12e60 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
12e70 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
12e80 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
12e90 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
12ea0 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
12eb0 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
12ec0 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
12ed0 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
12ee0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
12ef0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
12f00 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
12f10 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
12f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
12f30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12f40 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
12f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
12f60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
12f70 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
12f80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
12f90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
12fa0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
12fb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12fc0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12fd0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
12fe0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
12ff0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
13000 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13010 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
13020 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
13030 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
13040 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
13050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13060 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
13070 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
13080 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
13090 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
130a0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
130b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
130c0 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
130d0 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
130e0 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
130f0 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
13100 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
13110 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
13120 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
13130 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
13140 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
13150 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
13160 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
13170 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
13180 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
13190 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
131a0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
131b0 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
131c0 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
131d0 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
131e0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
131f0 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
13200 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
13210 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
13220 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
13230 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
13240 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
13250 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
13260 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
13270 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
13280 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
13290 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
132a0 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
132b0 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
132c0 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
132d0 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
132e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
132f0 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
13300 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
13310 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  t( sizeof(u64)==
13320 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
13330 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
13340 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13350 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
13360 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
13370 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
13380 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
13390 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
133a0 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
133b0 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
133c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
133d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
133e0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
133f0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
13400 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13410 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
13420 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
13430 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
13450 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
13460 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
13470 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
13480 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13490 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
134a0 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
134b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
134c0 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
134d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
134e0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
134f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
13500 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
13510 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
13520 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
13530 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13540 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
13550 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
13560 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
13570 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
13580 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
13590 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
135a0 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
135b0 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
135c0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
135d0 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
135e0 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
135f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
13600 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
13610 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
13620 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
13630 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
13640 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
13650 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
13660 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
13670 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
13680 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
13690 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
136a0 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
136b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
136c0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
136d0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
136e0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
136f0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
13700 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
13710 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
13720 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
13730 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
13740 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
13750 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
13760 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13770 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
13780 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
13790 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
137a0 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
137b0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
137c0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
137d0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
137e0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
137f0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
13800 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
13810 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
13820 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
13830 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
13840 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13850 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
13860 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
13870 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
13880 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
13890 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
138a0 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
138b0 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
138c0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
138d0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
138e0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
138f0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
13900 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
13910 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
13920 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
13930 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
13940 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
13950 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
13960 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
13970 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
13980 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
13990 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
139a0 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
139b0 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
139c0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
139d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
139e0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
139f0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
13a00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
13a10 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
13a20 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
13a30 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
13a40 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
13a50 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
13a60 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
13a70 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
13a80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
13a90 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
13aa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
13ab0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
13ac0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
13ad0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
13ae0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
13af0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
13b00 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
13b10 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
13b20 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
13b30 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
13b40 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
13b50 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
13b60 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
13b70 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
13b80 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
13b90 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
13ba0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
13bb0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
13bc0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13bd0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
13be0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
13bf0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
13c00 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
13c10 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
13c20 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
13c30 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
13c40 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
13c50 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
13c60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
13c70 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
13c80 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
13c90 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
13ca0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
13cb0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
13cc0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
13cd0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
13ce0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
13cf0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
13d00 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
13d10 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
13d20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
13d30 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
13d40 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
13d50 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
13d60 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
13d70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13d80 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
13d90 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
13da0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
13db0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
13dc0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
13dd0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
13de0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
13df0 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
13e00 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
13e10 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
13e20 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
13e30 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
13e40 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
13e50 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
13e60 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
13e70 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
13e80 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
13e90 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
13ea0 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
13eb0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
13ec0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
13ed0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
13ee0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
13ef0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
13f00 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
13f10 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
13f20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
13f30 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
13f40 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
13f50 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
13f60 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
13f70 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
13f80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
13fa0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
13fb0 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
13fc0 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
13fd0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
13fe0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
13ff0 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
14000 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
14010 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
14020 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
14030 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14040 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
14050 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
14060 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
14070 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
14080 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
14090 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
140a0 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
140b0 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
140c0 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
140d0 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
140e0 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
140f0 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
14100 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
14110 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
14120 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
14130 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
14140 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
14150 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
14160 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
14170 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
14180 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
14190 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
141a0 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
141b0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
141c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
141d0 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
141e0 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
141f0 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
14200 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
14210 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
14220 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
14230 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
14240 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
14250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
14260 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
14270 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
14280 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
14290 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
142a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
142b0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
142c0 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
142d0 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
142e0 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
142f0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
14300 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
14310 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14320 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
14330 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
14340 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
14350 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
14360 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
14370 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
14380 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
14390 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
143a0 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
143b0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
143c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
143d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
143e0 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
143f0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
14400 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
14410 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14420 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
14430 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
14440 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14450 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
14460 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
14470 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
14480 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14490 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
144a0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
144b0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
144c0 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
144d0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
144e0 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
144f0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
14500 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
14510 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
14520 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
14530 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
14540 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
14550 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
14560 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
14570 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
14580 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
14590 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
145a0 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
145b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
145c0 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
145d0 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
145e0 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
145f0 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ZE);.    }.  }. 
14600 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
14610 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
14620 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14630 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
14640 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14650 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
14660 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
14670 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
14680 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
14690 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
146a0 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
146b0 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
146c0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
146d0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
146e0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
146f0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
14700 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
14710 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
14720 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
14730 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
14740 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
14750 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
14760 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
14770 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
14780 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
14790 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
147a0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
147b0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
147c0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
147d0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
147e0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
147f0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
14800 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14810 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
14820 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
14830 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
14840 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
14850 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
14860 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
14870 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
14880 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
14890 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
148a0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
148b0 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
148c0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
148d0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
148e0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
148f0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
14900 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
14910 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
14920 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
14930 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14940 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
14950 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
14960 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
14970 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
14980 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
14990 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
149a0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
149b0 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
149c0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
149d0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
149e0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
149f0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
14a00 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
14a10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
14a20 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
14a30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14a40 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
14a50 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
14a60 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
14a70 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
14a80 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
14a90 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
14aa0 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
14ab0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
14ac0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
14ad0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
14ae0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
14af0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
14b00 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
14b10 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
14b20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
14b30 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
14b40 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
14b50 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
14b60 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
14b70 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
14b80 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
14b90 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
14ba0 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
14bb0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
14bc0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
14bd0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
14be0 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
14bf0 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
14c00 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
14c10 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
14c20 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
14c30 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
14c40 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
14c50 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
14c60 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
14c70 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
14c80 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
14c90 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
14ca0 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
14cb0 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
14cc0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
14cd0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
14ce0 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
14cf0 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
14d00 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
14d10 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
14d20 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
14d30 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
14d40 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
14d50 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
14d60 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
14d70 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
14d80 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
14d90 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
14da0 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
14db0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
14dc0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
14dd0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
14de0 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
14df0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
14e00 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
14e10 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
14e20 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
14e30 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
14e40 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
14e50 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
14e60 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
14e70 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
14e80 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
14e90 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
14ea0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
14eb0 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
14ec0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
14ed0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
14ee0 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
14ef0 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
14f00 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
14f10 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
14f20 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
14f30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14f40 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14f50 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
14f60 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
14f70 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
14f80 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
14f90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
14fa0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
14fb0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
14fc0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
14fd0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
14fe0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
14ff0 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
15000 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
15010 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
15020 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
15030 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
15040 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
15050 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
15060 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
15070 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
15080 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
15090 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
150a0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
150b0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
150c0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
150d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
150e0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
150f0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
15100 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
15110 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
15120 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
15130 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15140 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15150 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15160 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
15170 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
15180 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
15190 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
151a0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
151b0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
151c0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
151d0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
151e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
151f0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
15200 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
15210 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
15220 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
15230 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
15240 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
15250 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
15260 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
15270 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
15280 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
15290 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
152a0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
152b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
152c0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
152d0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
152e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
152f0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
15300 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
15310 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
15320 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
15330 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
15340 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
15350 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
15360 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
15370 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
15380 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
15390 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
153a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
153b0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
153c0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
153d0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
153e0 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
153f0 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
15400 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
15410 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
15420 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
15430 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
15440 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
15450 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
15460 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
15470 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
15480 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
15490 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
154a0 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
154b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
154c0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
154d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
154e0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
154f0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
15500 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
15510 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
15520 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
15530 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
15540 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
15550 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
15560 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
15570 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
15580 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
15590 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
155a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
155b0 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
155c0 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
155d0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
155e0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
155f0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
15600 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
15610 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
15620 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
15630 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
15640 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
15650 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
15660 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
15670 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15680 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
15690 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
156a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
156b0 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
156c0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
156d0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
156e0 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
156f0 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
15700 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
15710 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
15720 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
15730 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
15740 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
15750 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
15760 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
15770 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
15780 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
15790 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
157a0 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
157b0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
157c0 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
157d0 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
157e0 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
157f0 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
15800 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
15810 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
15820 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
15830 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
15840 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
15850 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
15860 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
15870 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
15880 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
15890 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
158a0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
158b0 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
158c0 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
158d0 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
158e0 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
158f0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
15900 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
15910 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
15920 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
15930 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
15940 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15950 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
15960 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
15970 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
15980 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15990 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
159a0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
159b0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
159c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
159d0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
159e0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
159f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
15a00 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
15a10 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15a20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15a30 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
15a40 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
15a50 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
15a60 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
15a70 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
15a80 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
15a90 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
15aa0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
15ab0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
15ac0 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
15ad0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
15ae0 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
15af0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15b00 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
15b10 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15b20 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15b30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15b40 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
15b50 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
15b60 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
15b70 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
15b80 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15b90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15ba0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
15bb0 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
15bc0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
15bd0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
15be0 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
15bf0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
15c00 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
15c10 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
15c20 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
15c30 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
15c40 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
15c50 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
15c60 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
15c70 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
15c80 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
15c90 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
15ca0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
15cb0 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
15cc0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
15cd0 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
15ce0 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
15cf0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
15d00 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
15d10 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15d20 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
15d30 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
15d40 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
15d50 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
15d60 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
15d70 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
15d80 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
15d90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
15da0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
15db0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
15dc0 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
15dd0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
15de0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
15df0 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
15e00 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
15e10 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
15e20 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
15e30 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
15e40 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
15e50 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
15e60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
15e70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15e80 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
15e90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
15ea0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
15eb0 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
15ec0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
15ed0 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
15ee0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
15ef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15f00 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
15f10 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
15f20 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
15f30 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
15f40 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
15f50 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
15f60 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
15f70 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
15f80 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
15f90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15fa0 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
15fb0 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
15fc0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15fd0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
15fe0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15ff0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
16000 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
16010 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16020 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
16030 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
16040 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
16050 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
16060 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
16070 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16080 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16090 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
160a0 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
160b0 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
160c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
160d0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
160e0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
160f0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
16100 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
16110 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
16120 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
16130 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
16140 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
16150 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
16160 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
16170 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
16180 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
16190 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
161a0 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
161b0 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
161c0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
161d0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
161e0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
161f0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
16200 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
16210 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
16220 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
16230 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
16240 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16250 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
16260 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
16270 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
16280 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
16290 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
162a0 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
162b0 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
162c0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
162d0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
162e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
162f0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
16300 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
16310 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
16320 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
16330 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
16340 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
16350 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
16360 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
16370 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
16380 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
16390 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
163a0 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
163b0 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
163c0 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
163d0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
163e0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
163f0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
16400 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
16410 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
16420 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
16430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
16440 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16450 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
16460 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
16470 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
16480 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16490 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49  ter(p);.#if SQLI
164a0 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
164b0 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d  f( nReserve>pBt-
164c0 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
164d0 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ) pBt->optimalRe
164e0 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73  serve = (u8)nRes
164f0 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  erve;.#endif.  i
16500 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
16510 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
16520 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
16530 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16540 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16550 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
16560 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
16570 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
16580 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
16590 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
165a0 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
165b0 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
165c0 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
165d0 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
165e0 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
165f0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
16600 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
16610 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
16620 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
16630 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
16640 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
16650 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
16660 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
16670 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
16680 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
16690 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
166a0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
166b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
166c0 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
166d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
166e0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
166f0 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
16700 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
16710 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
16720 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
16730 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
16740 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
16750 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
16760 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16770 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
16780 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16790 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
167a0 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
167b0 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
167c0 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
167d0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
167e0 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
167f0 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
16800 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
16810 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
16820 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
16830 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
16840 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
16850 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
16860 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
16870 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
16880 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
16890 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
168a0 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
168b0 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
168c0 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
168d0 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
168e0 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
168f0 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
16900 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
16910 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
16920 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
16930 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
16940 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
16950 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
16960 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
16970 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
16980 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
16990 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
169a0 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
169b0 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
169c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
169d0 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
169e0 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
169f0 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
16a00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
16a10 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
16a20 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
16a30 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   n;.  assert( sq
16a40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16a50 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
16a60 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
16a70 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
16a80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
16a90 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
16aa0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
16ab0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16ac0 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
16ad0 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
16ae0 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
16af0 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
16b00 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
16b10 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
16b20 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
16b30 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
16b40 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a  y extensions..**
16b50 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41  .** If SQLITE_HA
16b60 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e  S_MUTEX is defin
16b70 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed then the numb
16b80 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  er returned is t
16b90 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66  he.** greater of
16ba0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
16bb0 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20  erved space and 
16bc0 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75  the maximum requ
16bd0 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65  ested.** reserve
16be0 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73   space..*/.int s
16bf0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70  qlite3BtreeGetOp
16c00 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72  timalReserve(Btr
16c10 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
16c20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16c30 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
16c40 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
16c50 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b  serveNoMutex(p);
16c60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
16c70 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
16c80 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  <p->pBt->optimal
16c90 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d  Reserve ) n = p-
16ca0 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
16cb0 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73  erve;.#endif.  s
16cc0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16cd0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
16ce0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
16cf0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
16d00 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
16d10 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
16d20 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
16d30 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
16d40 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
16d50 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
16d60 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
16d70 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
16d80 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
16d90 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
16da0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
16db0 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
16dc0 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
16dd0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
16de0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
16df0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
16e00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
16e10 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
16e20 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
16e30 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
16e40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16e50 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
16e60 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45 43   Set the BTS_SEC
16e70 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20  URE_DELETE flag 
16e80 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20  if newFlag is 0 
16e90 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61  or 1.  If newFla
16ea0 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e  g is -1,.** then
16eb0 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   make no changes
16ec0 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e  .  Always return
16ed0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
16ee0 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
16ef0 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61  ETE.** setting a
16f00 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e  fter the change.
16f10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16f20 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
16f30 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
16f40 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
16f50 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
16f60 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
16f70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16f80 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
16f90 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
16fa0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
16fb0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
16fc0 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67  .    if( newFlag
16fd0 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c   ) p->pBt->btsFl
16fe0 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
16ff0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20  E_DELETE;.  } . 
17000 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74   b = (p->pBt->bt
17010 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
17020 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a  URE_DELETE)!=0;.
17030 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17040 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17050 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   b;.}../*.** Cha
17060 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61  nge the 'auto-va
17070 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f  cuum' property o
17080 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
17090 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75  If the 'autoVacu
170a0 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  um'.** parameter
170b0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
170c0 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  en auto-vacuum m
170d0 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20  ode is enabled. 
170e0 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69  If zero, it.** i
170f0 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20  s disabled. The 
17100 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
17110 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  r the auto-vacuu
17120 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a  m property is .*
17130 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
17140 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  the SQLITE_DEFAU
17150 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61  LT_AUTOVACUUM ma
17160 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  cro..*/.int sqli
17170 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
17180 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20  acuum(Btree *p, 
17190 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b  int autoVacuum){
171a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
171b0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
171c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
171d0 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20  EADONLY;.#else. 
171e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
171f0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
17200 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17210 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74   u8 av = (u8)aut
17220 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69  oVacuum;..  sqli
17230 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17240 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  ;.  if( (pBt->bt
17250 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
17260 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20  ESIZE_FIXED)!=0 
17270 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
17280 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
17290 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
172a0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
172b0 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
172c0 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
172d0 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
172e0 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
172f0 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
17300 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17310 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
17320 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
17330 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
17340 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
17350 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
17360 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
17370 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
17380 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
17390 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
173a0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
173b0 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
173c0 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
173d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
173e0 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
173f0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
17400 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
17410 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17420 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
17430 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
17440 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
17450 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
17460 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
17470 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
17480 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
17490 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
174a0 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
174b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
174c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
174d0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
174e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
174f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
17500 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
17510 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
17520 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
17530 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
17540 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
17550 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
17560 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
17570 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
17580 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
17590 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
175a0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
175b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
175c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
175d0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
175e0 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
175f0 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
17600 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
17610 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
17620 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
17630 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
17640 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
17650 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
17660 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
17670 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
17680 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
17690 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d  nctions */.  Mem
176a0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20  Page *pPage1;   
176b0 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74    /* Page 1 of t
176c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
176d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
176e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
176f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
17700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
17710 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65  .  int nPageFile
17720 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65   = 0;   /* Numbe
17730 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
17740 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
17750 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65  */.  int nPageHe
17760 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  ader;     /* Num
17770 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
17780 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63 63  the database acc
17790 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f  ording to hdr */
177a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
177b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
177c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
177d0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
177e0 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d  ge1==0 );.  rc =
177f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68 61   sqlite3PagerSha
17800 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61  redLock(pBt->pPa
17810 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ger);.  if( rc!=
17820 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
17830 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74  rn rc;.  rc = bt
17840 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
17850 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
17860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17870 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
17880 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
17890 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
178a0 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
178b0 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
178c0 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
178d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
178e0 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20  .  */.  nPage = 
178f0 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65  nPageHeader = ge
17900 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
17910 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
17920 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
17930 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
17940 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b  er, &nPageFile);
17950 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
17960 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38  || memcmp(24+(u8
17970 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
17980 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d   92+(u8*)pPage1-
17990 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a  >aData,4)!=0 ){.
179a0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
179b0 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eFile;.  }.  if(
179c0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
179d0 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32 pageSize;.  
179e0 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65    u32 usableSize
179f0 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
17a00 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
17a10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17a20 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20  _NOTADB;.    /* 
17a30 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
17a40 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72 79  3737-39999 Every
17a50 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61   valid SQLite da
17a60 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67 69  tabase file begi
17a70 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  ns.    ** with t
17a80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20  he following 16 
17a90 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20  bytes (in hex): 
17aa0 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20 36  53 51 4c 69 74 6
17ab0 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36 64  5 20 66 6f 72 6d
17ac0 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30  .    ** 61 74 20
17ad0 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69   33 00. */.    i
17ae0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
17af0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
17b00 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
17b10 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
17b20 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69  ailed;.    }..#i
17b30 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
17b40 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67  _WAL.    if( pag
17b50 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
17b60 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
17b70 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
17b80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17b90 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
17ba0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
17bb0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
17bc0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28   }.#else.    if(
17bd0 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a   page1[18]>2 ){.
17be0 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
17bf0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
17c00 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ONLY;.    }.    
17c10 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20  if( page1[19]>2 
17c20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
17c30 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
17c40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
17c50 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72 73  f the write vers
17c60 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c  ion is set to 2,
17c70 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73   this database s
17c80 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73 65  hould be accesse
17c90 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20  d.    ** in WAL 
17ca0 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67  mode. If the log
17cb0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
17cc0 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f  open, open it no
17cd0 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20  w. Then .    ** 
17ce0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17cf0 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68   and return with
17d00 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42  out populating B
17d10 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a  tShared.pPage1..
17d20 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
17d30 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20 61  r detects this a
17d40 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  nd calls this fu
17d50 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68  nction again. Th
17d60 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  is is.    ** req
17d70 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65 72  uired as the ver
17d80 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63  sion of page 1 c
17d90 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20  urrently in the 
17da0 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20 20  page1 buffer.   
17db0 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74   ** may not be t
17dc0 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f  he latest versio
17dd0 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65  n - there may be
17de0 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20   a newer one in 
17df0 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66  the log.    ** f
17e00 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
17e10 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32  if( page1[19]==2
17e20 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
17e30 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29  gs & BTS_NO_WAL)
17e40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
17e50 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20   isOpen = 0;.   
17e60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17e70 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d  agerOpenWal(pBt-
17e80 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e  >pPager, &isOpen
17e90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
17ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17eb0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17ec0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17ed0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
17ee0 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Open==0 ){.     
17ef0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17f00 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20  Page1);.        
17f10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17f20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17f30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
17f40 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
17f50 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
17f60 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30  E-OF: R-15465-20
17f70 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  813 The maximum 
17f80 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65  and minimum embe
17f90 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20  dded payload.   
17fa0 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e   ** fractions an
17fb0 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f  d the leaf paylo
17fc0 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75  ad fraction valu
17fd0 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33  es must be 64, 3
17fe0 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a  2, and 32..    *
17ff0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  *.    ** The ori
18000 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
18010 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
18020 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
18030 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
18040 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
18050 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
18060 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
18070 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
18080 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
18090 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
180a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
180b0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
180c0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
180d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
180e0 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
180f0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
18100 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
18110 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
18120 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
18130 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
18140 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
18150 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
18160 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
18170 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18180 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61   file. */.    pa
18190 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
181a0 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
181b0 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f  [17]<<16);.    /
181c0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
181d0 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65  -25008-21688 The
181e0 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
181f0 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
18200 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e  o.    ** between
18210 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69   512 and 65536 i
18220 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20  nclusive. */.   
18230 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
18240 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
18250 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
18260 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
18270 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
18280 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
18290 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
182a0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
182b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
182c0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
182d0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a   7)==0 );.    /*
182e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
182f0 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20  59310-51205 The 
18300 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22  "reserved space"
18310 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62   size in the 1-b
18320 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  yte.    ** integ
18330 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20  er at offset 20 
18340 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
18350 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
18360 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20  at the end of.  
18370 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74    ** each page t
18380 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78  o reserve for ex
18390 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a  tensions. .    *
183a0 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  *.    ** EVIDENC
183b0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
183c0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
183d0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
183e0 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ion is.    ** de
183f0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
18400 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
18410 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
18420 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
18430 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  20.    ** into t
18440 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18450 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
18460 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
18470 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
18480 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
18490 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
184a0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
184b0 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
184c0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
184d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
184e0 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
184f0 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
18500 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
18510 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
18520 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
18530 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
18540 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
18550 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
18560 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
18570 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
18580 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
18590 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
185a0 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
185b0 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
185c0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
185d0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
185e0 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
185f0 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
18600 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18610 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
18620 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18630 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
18640 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
18650 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
18660 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
18670 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
18680 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
18690 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
186a0 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
186b0 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
186d0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
186e0 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
186f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18710 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
18720 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
18730 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
18740 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
18750 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18760 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18770 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18780 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18790 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
187a0 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
187b0 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
187c0 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
187d0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
187e0 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
187f0 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
18800 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
18810 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
18820 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
18830 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
18840 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
18850 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
18860 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
18870 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
18880 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18890 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
188a0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
188b0 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
188c0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
188d0 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
188e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
188f0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
18900 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
18910 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
18920 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
18930 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
18940 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
18950 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
18960 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
18970 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
18980 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
18990 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
189a0 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
189b0 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
189c0 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
189d0 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
189e0 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
189f0 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
18a00 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
18a10 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
18a20 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
18a30 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
18a40 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
18a50 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
18a60 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
18a70 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
18a80 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
18a90 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
18aa0 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
18ab0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
18ac0 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
18ad0 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
18ae0 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
18af0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
18b00 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
18b10 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
18b20 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
18b30 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
18b40 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
18b50 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
18b60 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
18b70 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
18b80 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
18b90 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
18ba0 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
18bb0 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
18bc0 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
18bd0 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
18be0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
18bf0 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
18c00 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
18c10 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
18c20 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
18c30 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
18c40 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
18c50 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18c60 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
18c70 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
18c80 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
18c90 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
18ca0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
18cb0 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
18cc0 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
18cd0 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
18ce0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
18cf0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
18d00 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
18d10 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
18d20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
18d30 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
18d40 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
18d50 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
18d60 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
18d70 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
18d80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
18d90 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
18da0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
18db0 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
18dc0 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
18dd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
18de0 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
18df0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18e00 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65  r of cursors ope
18e10 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69  n on pBt. This i
18e20 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
18e30 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
18e40 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
18e50 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
18e60 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
18e70 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
18e80 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
18e90 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69  rs are counted i
18ea0 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65  f wrOnly is true
18eb0 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a  .  If wrOnly is.
18ec0 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c  ** false then al
18ed0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  l cursors are co
18ee0 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  unted..**.** For
18ef0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
18f00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
18f10 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63   cursor is any c
18f20 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
18f30 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64   capable of read
18f40 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
18f50 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
18f60 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
18f70 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
18f80 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
18f90 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
18fa0 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
18fb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
18fc0 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
18fd0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
18fe0 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
18ff0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
19000 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
19010 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
19020 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
19030 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
19040 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
19050 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
19060 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
19070 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
19080 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
19090 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
190a0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
190b0 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
190c0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
190d0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
190e0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
190f0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
19100 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
19110 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
19120 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
19130 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
19140 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
19150 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
19160 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19180 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
19190 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
191a0 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
191b0 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
191c0 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
191d0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
191e0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
191f0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
19200 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
19210 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
19220 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19230 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19240 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
19250 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
19260 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
19270 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
19280 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
19290 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
192a0 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
192b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
192c0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
192d0 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
192e0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
192f0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
19300 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e1;.    assert( 
19310 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
19320 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
19330 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
19340 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
19350 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  1 );.    pBt->pP
19360 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65  age1 = 0;.    re
19370 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
19380 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
19390 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
193a0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
193b0 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
193c0 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
193d0 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
193e0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
193f0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
19400 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19410 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
19420 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19430 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
19440 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
19450 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
19460 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
19470 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
19480 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19490 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
194a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
194b0 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
194c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
194d0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
194e0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
194f0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
19500 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
19510 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
19520 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19530 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
19540 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
19550 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
19560 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
19570 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
19580 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
19590 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
195a0 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
195b0 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
195c0 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
195d0 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
195e0 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
195f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
19600 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
19610 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
19620 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
19630 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
19640 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
19650 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
19660 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
19670 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
19680 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
19690 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
196a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
196b0 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
196c0 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
196d0 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
196e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
196f0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
19700 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
19710 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
19720 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
19730 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
19740 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
19750 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
19760 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19770 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
19780 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
19790 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
197a0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
197b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
197c0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
197d0 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
197e0 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
197f0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
19800 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
19810 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
19820 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
19830 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
19840 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
19850 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
19860 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
19870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
19890 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
198a0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
198b0 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
198c0 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
198d0 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
198e0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
198f0 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
19900 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
19910 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
19920 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
19930 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
19940 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
19950 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
19960 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
19970 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
19980 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19990 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
199a0 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
199b0 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
199c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
199d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
199e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
199f0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
19a00 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19a10 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
19a20 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
19a30 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
19a40 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
19a50 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
19a60 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
19a70 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
19a80 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19a90 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
19aa0 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
19ab0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19ac0 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
19ad0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
19ae0 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
19af0 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
19b00 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
19b10 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
19b20 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
19b30 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
19b40 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
19b50 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
19b60 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
19b70 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
19b80 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
19b90 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
19ba0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
19bb0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
19bc0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
19bd0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
19be0 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
19bf0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
19c00 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
19c10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
19c20 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
19c30 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
19c40 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
19c50 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
19c60 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
19c70 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
19c80 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
19c90 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
19ca0 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
19cb0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
19cc0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
19cd0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
19ce0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
19cf0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
19d00 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
19d10 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
19d20 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
19d30 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
19d40 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
19d50 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
19d60 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
19d70 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
19d80 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
19d90 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
19da0 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
19db0 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
19dc0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
19dd0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
19de0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
19df0 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
19e00 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
19e10 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
19e20 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
19e30 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
19e40 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
19e50 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
19e60 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
19e70 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
19e80 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
19e90 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
19ea0 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
19eb0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
19ec0 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
19ed0 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
19ee0 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
19ef0 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
19f00 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
19f10 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
19f20 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
19f30 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
19f40 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
19f50 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
19f60 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
19f70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
19f80 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
19f90 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
19fa0 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
19fb0 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
19fc0 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
19fd0 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
19fe0 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
19ff0 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
1a000 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
1a010 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
1a020 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
1a030 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
1a040 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
1a050 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
1a060 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
1a070 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
1a080 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a090 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
1a0a0 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
1a0b0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
1a0c0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
1a0d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a0e0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
1a0f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
1a100 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a110 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1a120 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1a130 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
1a140 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
1a150 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
1a160 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
1a170 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
1a180 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
1a190 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1a1a0 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
1a1b0 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
1a1c0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1a1d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1a1e0 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
1a1f0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
1a200 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
1a210 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
1a220 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
1a230 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1a240 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1a250 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
1a260 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
1a270 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
1a280 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
1a290 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
1a2a0 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
1a2b0 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
1a2c0 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
1a2d0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1a2e0 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
1a2f0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
1a300 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1a310 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
1a320 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
1a330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a340 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1a350 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
1a360 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
1a370 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
1a380 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
1a390 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
1a3a0 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
1a3b0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
1a3c0 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
1a3d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
1a3e0 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
1a3f0 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
1a400 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77  D..  */.  if( (w
1a410 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1a420 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1a430 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20  NS_WRITE).   || 
1a440 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1a450 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
1a460 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b  .  ){.    pBlock
1a470 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d   = pBt->pWriter-
1a480 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >db;.  }else if(
1a490 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
1a4a0 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
1a4b0 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
1a4c0 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
1a4d0 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
1a4e0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1a4f0 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
1a500 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f   ){.        pBlo
1a510 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1a520 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1a530 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a540 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
1a550 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Block ){.    sql
1a560 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
1a570 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c  ocked(p->db, pBl
1a580 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ock);.    rc = S
1a590 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
1a5a0 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f  REDCACHE;.    go
1a5b0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1a5c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1a5d0 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f   Any read-only o
1a5e0 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61  r read-write tra
1a5f0 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73  nsaction implies
1a600 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
1a610 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f  .  ** page 1. So
1a620 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   if some other s
1a630 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65  hared-cache clie
1a640 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  nt already has a
1a650 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a   write-lock .  *
1a660 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  * on page 1, the
1a670 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e   transaction can
1a680 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a  not be opened. *
1a690 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68  /.  rc = querySh
1a6a0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1a6b0 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
1a6c0 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  T, READ_LOCK);. 
1a6d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1a6e0 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f  rc ) goto trans_
1a6f0 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62  begun;..  pBt->b
1a700 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1a710 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1a720 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
1a730 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46  e==0 ) pBt->btsF
1a740 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54  lags |= BTS_INIT
1a750 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64  IALLY_EMPTY;.  d
1a760 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
1a770 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
1a780 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
1a790 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
1a7a0 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
1a7b0 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
1a7c0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
1a7d0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
1a7e0 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
1a7f0 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
1a800 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
1a810 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
1a820 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
1a830 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
1a840 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
1a850 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
1a860 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
1a870 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
1a880 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
1a890 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
1a8a0 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
1a8b0 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
1a8c0 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
1a8d0 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
1a8e0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1a8f0 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
1a900 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
1a910 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
1a920 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
1a930 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
1a940 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1a950 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1a960 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  g ){.      if( (
1a970 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1a980 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1a990 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1a9a0 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1a9b0 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
1a9c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a9d0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
1a9e0 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
1a9f0 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
1aa00 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
1aa10 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1aa20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1aa30 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
1aa40 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1aa50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1aa60 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1aa70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1aa80 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42  ){.      unlockB
1aa90 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1aaa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  );.    }.  }whil
1aab0 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51  e( (rc&0xFF)==SQ
1aac0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74  LITE_BUSY && pBt
1aad0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1aae0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20  =TRANS_NONE &&. 
1aaf0 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e           btreeIn
1ab00 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
1ab10 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72  pBt) );..  if( r
1ab20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ab30 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1ab40 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1ab50 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
1ab60 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
1ab70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ab80 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1ab90 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
1aba0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ble ){.        a
1abb0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
1abc0 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
1abd0 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
1abe0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1abf0 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
1ac00 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
1ac10 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
1ac20 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
1ac30 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
1ac40 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
1ac50 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
1ac60 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
1ac70 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
1ac80 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
1ac90 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1aca0 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
1acb0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
1acc0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1acd0 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
1ace0 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
1acf0 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
1ad00 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1ad10 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
1ad20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1ad30 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1ad40 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
1ad50 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
1ad60 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
1ad70 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  p;.      pBt->bt
1ad80 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45  sFlags &= ~BTS_E
1ad90 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
1ada0 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70  if( wrflag>1 ) p
1adb0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1adc0 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23  BTS_EXCLUSIVE;.#
1add0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
1ade0 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68  If the db-size h
1adf0 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69  eader field is i
1ae00 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20  ncorrect (as it 
1ae10 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64  may be if an old
1ae20 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74  .      ** client
1ae30 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e   has been writin
1ae40 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1ae50 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20  ile), update it 
1ae60 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20  now. Doing.     
1ae70 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20   ** this sooner 
1ae80 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
1ae90 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  r means the data
1aea0 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61  base size can sa
1aeb0 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72  fely .      ** r
1aec0 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62  e-read the datab
1aed0 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61  ase size from pa
1aee0 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f  ge 1 if a savepo
1aef0 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  int or transacti
1af00 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  on.      ** roll
1af10 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68  back occurs with
1af20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
1af30 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1af40 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
1af50 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61  e!=get4byte(&pPa
1af60 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20  ge1->aData[28]) 
1af70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1af80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1af90 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1afa0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1afb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1afc0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1afd0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1afe0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1aff0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1b000 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1b010 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
1b020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b030 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
1b040 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
1b050 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
1b060 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
1b070 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
1b080 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65  er of.    ** ope
1b090 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66  n savepoints. If
1b0a0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
1b0b0 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72  meter is greater
1b0c0 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20   than 0 and.    
1b0d0 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
1b0e0 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  al is not alread
1b0f0 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  y open, then it 
1b100 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68  will be opened h
1b110 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
1b120 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1b130 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
1b140 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
1b150 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
1b160 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1b170 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
1b180 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1b190 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b1a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1b1b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1b1c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1b1d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
1b1e0 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
1b1f0 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
1b200 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
1b210 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
1b220 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
1b230 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1b240 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
1b250 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
1b260 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
1b270 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
1b280 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b290 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1b2a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1b2b0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2d0 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
1b2e0 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
1b2f0 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
1b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b310 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1b320 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
1b330 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b360 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
1b370 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b380 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
1b390 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
1b3a0 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
1b3b0 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
1b3c0 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
1b3d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b3e0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1b3f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1b400 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  = btreeInitPage(
1b410 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1b420 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b430 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c     goto set_chil
1b440 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
1b450 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61   }.  nCell = pPa
1b460 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
1b470 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1b480 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1b490 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1b4a0 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
1b4b0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
1b4c0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
1b4d0 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
1b4e0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1b4f0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1b500 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
1b510 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
1b520 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1b530 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1b540 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1b550 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1b560 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1b570 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1b580 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1b590 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1b5a0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1b5b0 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
1b5c0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1b5d0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1b5e0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73  no, &rc);.  }..s
1b5f0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
1b600 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
1b610 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
1b620 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
1b630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
1b640 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
1b650 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
1b660 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
1b670 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
1b680 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
1b690 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
1b6a0 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
1b6b0 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
1b6c0 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
1b6d0 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
1b6e0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
1b6f0 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
1b700 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1b710 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1b720 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
1b730 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
1b740 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1b750 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
1b760 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1b770 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
1b780 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1b790 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1b7a0 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
1b7d0 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
1b7e0 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
1b7f0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1b800 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
1b810 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
1b820 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1b830 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
1b840 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b850 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
1b860 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
1b870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1b880 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1b890 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1b8a0 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
1b8b0 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
1b8c0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1b8d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1b8e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1b8f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1b900 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1b910 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1b920 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
1b930 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1b940 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
1b950 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
1b960 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
1b970 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
1b980 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1b990 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
1b9a0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1b9b0 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
1b9c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b9d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1b9e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  T;.    }.    put
1b9f0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1ba00 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1ba10 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74  e{.    u8 isInit
1ba20 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
1ba30 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  Init;.    int i;
1ba40 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  .    int nCell;.
1ba50 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20      int rc;..   
1ba60 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1ba70 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1ba80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1ba90 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1baa0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1bab0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1bac0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1bad0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1bae0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1baf0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1bb00 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1bb10 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1bb20 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1bb30 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1bb40 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1bb50 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1bb60 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
1bb70 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
1bb80 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69   && pCell+info.i
1bb90 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67  Overflow+3<=pPag
1bba0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1bbb0 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20  maskPage.       
1bbc0 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34    && iFrom==get4
1bbd0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
1bbe0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20  .iOverflow]).   
1bbf0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1bc00 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c    put4byte(&pCel
1bc10 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
1bc20 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  ], iTo);.       
1bc30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1bc40 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1bc50 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
1bc60 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
1bc70 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
1bc80 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
1bc90 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1bca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1bcb0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1bcc0 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
1bcd0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
1bce0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
1bcf0 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
1bd00 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
1bd10 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1bd20 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
1bd30 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1bd40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1bd50 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1bd60 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
1bd70 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1bd80 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1bd90 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
1bda0 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
1bdb0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
1bdc0 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
1bdd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
1bde0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
1bdf0 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
1be00 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
1be10 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
1be20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
1be30 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
1be40 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
1be50 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20  ns valid..**.** 
1be60 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61  The isCommit fla
1be70 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  g indicates that
1be80 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
1be90 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68  d to remember th
1bea0 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  at.** the journa
1beb0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79  l needs to be sy
1bec0 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61  nc()ed before da
1bed0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
1bee0 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61  age->pgno .** ca
1bef0 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  n be written to.
1bf00 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   The caller has 
1bf10 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64  already promised
1bf20 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f   not to write to
1bf30 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a   that.** page..*
1bf40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
1bf50 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
1bf60 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
1bf70 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
1bf80 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
1bf90 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
1bfa0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
1bfb0 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
1bfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfd0 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
1bfe0 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
1bff0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1c000 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
1c010 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1c020 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
1c030 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1c040 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
1c050 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
1c060 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
1c070 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
1c080 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
1c090 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  mit             
1c0a0 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  /* isCommit flag
1c0b0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
1c0c0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20  e3PagerMovepage 
1c0d0 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
1c0e0 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
1c0f0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
1c100 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
1c110 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
1c120 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
1c130 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
1c140 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1c150 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1c160 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1c170 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
1c180 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
1c190 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1c1a0 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
1c1b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
1c1c0 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
1c1d0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
1c1e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c1f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1c200 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1c210 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
1c220 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
1c230 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
1c240 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
1c250 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
1c260 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
1c270 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
1c280 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
1c290 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
1c2a0 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
1c2b0 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
1c2c0 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
1c2d0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1c2e0 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
1c2f0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c300 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
1c310 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
1c320 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1c330 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
1c340 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c350 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1c360 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
1c370 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
1c380 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
1c390 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
1c3a0 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
1c3b0 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
1c3c0 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
1c3d0 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
1c3e0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1c3f0 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
1c400 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
1c410 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
1c420 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
1c430 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
1c440 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
1c450 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
1c460 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
1c470 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
1c480 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
1c490 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
1c4a0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1c4b0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
1c4c0 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
1c4d0 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
1c4e0 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
1c4f0 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
1c500 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1c510 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
1c520 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1c530 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1c540 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1c550 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
1c560 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
1c570 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1c580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c590 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c5a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1c5b0 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
1c5c0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
1c5d0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
1c5e0 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
1c5f0 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  0 ){.      ptrma
1c600 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76  pPut(pBt, nextOv
1c610 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
1c620 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c  LOW2, iFreePage,
1c630 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
1c640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c650 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1c660 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1c670 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
1c680 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
1c690 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
1c6a0 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
1c6b0 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
1c6c0 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
1c6d0 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
1c6e0 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
1c6f0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
1c700 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
1c710 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
1c720 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
1c730 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
1c740 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1c750 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20  (pBt, iPtrPage, 
1c760 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20  &pPtrPage, 0);. 
1c770 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c790 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1c7a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1c7b0 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61  agerWrite(pPtrPa
1c7c0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
1c7d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c7e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1c7f0 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
1c800 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1c810 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1c820 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  c = modifyPagePo
1c830 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20  inter(pPtrPage, 
1c840 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1c850 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20  ge, eType);.    
1c860 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1c870 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1c880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c890 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1c8a0 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
1c8b0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1c8c0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1c8d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c8e0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
1c8f0 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
1c900 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
1c910 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
1c920 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
1c930 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
1c940 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
1c950 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
1c960 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
1c970 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
1c980 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1c990 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
1c9a0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
1c9b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
1c9c0 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
1c9d0 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
1c9e0 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e  fore no point in
1c9f0 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69   .** calling thi
1ca00 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
1ca10 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
1ca20 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e  _DONE. Or, if an
1ca30 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72   error .** occur
1ca40 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f  s, return some o
1ca50 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e  ther error code.
1ca60 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
1ca70 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66  ifically, this f
1ca80 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
1ca90 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20   to re-organize 
1caa0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20  the database so 
1cab0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73  .** that the las
1cac0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  t page of the fi
1cad0 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  le currently in 
1cae0 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  use is no longer
1caf0 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50   in use..**.** P
1cb00 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73  arameter nFin is
1cb10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1cb20 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64  ages that this d
1cb30 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f  atabase would co
1cb40 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68  ntain.** were th
1cb50 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  is function call
1cb60 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  ed until it retu
1cb70 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  rns SQLITE_DONE.
1cb80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43  .**.** If the bC
1cb90 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20  ommit parameter 
1cba0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69  is non-zero, thi
1cbb0 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
1cbc0 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  es that the .** 
1cbd0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
1cbe0 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
1cbf0 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20  uumStep() until 
1cc00 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1cc10 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e  E_DONE .** or an
1cc20 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20   error. bCommit 
1cc30 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66  is passed true f
1cc40 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1cc50 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20  m-on-commit .** 
1cc60 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61  operation, or fa
1cc70 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65  lse for an incre
1cc80 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
1cc90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
1cca0 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
1ccb0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1ccc0 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
1ccd0 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  Pg, int bCommit)
1cce0 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
1ccf0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
1cd00 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1cd10 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
1cd20 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  ee-list */.  int
1cd30 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1cd40 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1cd50 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1cd60 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73  ;.  assert( iLas
1cd70 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69  tPg>nFin );..  i
1cd80 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47  f( !PTRMAP_ISPAG
1cd90 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
1cda0 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44  && iLastPg!=PEND
1cdb0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1cdc0 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79  t) ){.    u8 eTy
1cdd0 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74  pe;.    Pgno iPt
1cde0 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65  rPage;..    nFre
1cdf0 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65  eList = get4byte
1ce00 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1ce10 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69  Data[36]);.    i
1ce20 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20  f( nFreeList==0 
1ce30 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1ce40 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1ce50 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72   }..    rc = ptr
1ce60 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73  mapGet(pBt, iLas
1ce70 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50  tPg, &eType, &iP
1ce80 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  trPage);.    if(
1ce90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cea0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1ceb0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1cec0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
1ced0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20  OOTPAGE ){.     
1cee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1cef0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1cf00 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70   }..    if( eTyp
1cf10 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
1cf20 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  GE ){.      if( 
1cf30 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1cf40 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
1cf50 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  the page from th
1cf60 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73  e files free-lis
1cf70 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72  t. This is not r
1cf80 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20  equired.        
1cf90 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  ** if bCommit is
1cfa0 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
1cfb0 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
1cfc0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
1cfd0 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
1cfe0 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
1cff0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1d000 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
1d010 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
1d020 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
1d030 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
1d040 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
1d050 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
1d060 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
1d070 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
1d080 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1d090 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1d0a0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1d0b0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1d0c0 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
1d0d0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b   BTALLOC_EXACT);
1d0e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1d0f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d100 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1d110 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1d120 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1d130 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
1d140 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
1d150 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
1d160 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
1d170 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
1d180 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
1d190 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
1d1a0 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
1d1b0 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
1d1c0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1d1d0 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38  LastPg;.      u8
1d1e0 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1d1f0 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20  _ANY;   /* Mode 
1d200 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1d210 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d220 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20  ) */.      Pgno 
1d230 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20  iNear = 0;      
1d240 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70       /* nearby p
1d250 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1d260 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1d270 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   */..      rc = 
1d280 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1d290 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
1d2a0 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
1d2b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d2c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1d2d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
1d2e0 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d        /* If bCom
1d2f0 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  mit is zero, thi
1d300 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
1d310 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
1d320 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
1d330 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
1d340 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
1d350 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
1d360 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
1d370 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
1d380 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
1d390 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74  hand, if bCommit
1d3a0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1d3b0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70   zero, then keep
1d3c0 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e  .      ** loopin
1d3d0 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70  g until a free-p
1d3e0 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68  age located with
1d3f0 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69  in the first nFi
1d400 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  n pages.      **
1d410 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1d420 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  found..      */.
1d430 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69        if( bCommi
1d440 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1d450 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1d460 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61  LE;.        iNea
1d470 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  r = nFin;.      
1d480 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20  }.      do {.   
1d490 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46       MemPage *pF
1d4a0 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72  reePg;.        r
1d4b0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
1d4c0 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65  ePage(pBt, &pFre
1d4d0 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69  ePg, &iFreePg, i
1d4e0 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20  Near, eMode);.  
1d4f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d510 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d520 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1d530 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1d540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d550 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1d560 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
1d570 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26  hile( bCommit &&
1d580 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
1d590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
1d5a0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
1d5b0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
1d5c0 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
1d5d0 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
1d5e0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1d5f0 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74  iFreePg, bCommit
1d600 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
1d610 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1d620 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d630 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d640 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d650 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d660 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1d670 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
1d680 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
1d690 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50    }while( iLastP
1d6a0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1d6b0 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52  PAGE(pBt) || PTR
1d6c0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1d6d0 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20  iLastPg) );.    
1d6e0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1d6f0 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e   = 1;.    pBt->n
1d700 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a  Page = iLastPg;.
1d710 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1d720 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d730 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   The database op
1d740 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ened by the firs
1d750 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
1d760 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1d770 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70  abase.** nOrig p
1d780 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ages in size con
1d790 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72  taining nFree fr
1d7a0 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ee pages. Return
1d7b0 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
1d7c0 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  * size of the da
1d7d0 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20  tabase in pages 
1d7e0 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74  following an aut
1d7f0 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69  o-vacuum operati
1d800 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  on..*/.static Pg
1d810 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42  no finalDbSize(B
1d820 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1d830 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e  no nOrig, Pgno n
1d840 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e  Free){.  int nEn
1d850 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  try;            
1d860 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d870 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e  er of entries on
1d880 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65   one ptrmap page
1d890 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d   */.  Pgno nPtrm
1d8a0 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
1d8b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d8c0 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
1d8d0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1d8e0 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d900 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
1d910 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20   */..  nEntry = 
1d920 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
1d930 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  5;.  nPtrmap = (
1d940 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
1d950 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
1d960 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45  Orig)+nEntry)/nE
1d970 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e  ntry;.  nFin = n
1d980 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e  Orig - nFree - n
1d990 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f  Ptrmap;.  if( nO
1d9a0 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
1d9b0 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
1d9c0 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
1d9d0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1d9e0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77   nFin--;.  }.  w
1d9f0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
1da00 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
1da10 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
1da20 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1da30 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1da40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e  }..  return nFin
1da50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
1da60 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1da70 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
1da80 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
1da90 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
1daa0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
1dab0 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
1dac0 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
1dad0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1dae0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
1daf0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
1db00 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
1db10 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
1db20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
1db30 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
1db40 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
1db50 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
1db60 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
1db70 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
1db80 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
1db90 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
1dba0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
1dbb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1dbc0 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
1dbd0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1dbe0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1dbf0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
1dc00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1dc10 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
1dc20 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1dc30 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
1dc40 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1dc50 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
1dc60 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
1dc70 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
1dc80 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
1dc90 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  lse{.    Pgno nO
1dca0 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1dcb0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50  ount(pBt);.    P
1dcc0 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34  gno nFree = get4
1dcd0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1dce0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1dcf0 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66     Pgno nFin = f
1dd00 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1dd10 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a  nOrig, nFree);..
1dd20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46      if( nOrig<nF
1dd30 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  in ){.      rc =
1dd40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1dd50 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  BKPT;.    }else 
1dd60 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20  if( nFree>0 ){. 
1dd70 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1dd80 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1dd90 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1dda0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ddb0 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61          invalida
1ddc0 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
1ddd0 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  he(pBt);.       
1dde0 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
1ddf0 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20  Step(pBt, nFin, 
1de00 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20  nOrig, 0);.     
1de10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
1de20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1de30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1de40 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1de50 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1de60 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  e);.        put4
1de70 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1de80 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1de90 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1dea0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1deb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1dec0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
1ded0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1dee0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1def0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1df00 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1df10 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71  lled prior to sq
1df20 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1df30 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
1df40 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74  ion.** is commit
1df50 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
1df60 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
1df70 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1df80 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1df90 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
1dfa0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
1dfb0 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
1dfc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dfd0 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
1dfe0 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
1dff0 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
1e000 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
1e010 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
1e020 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
1e030 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
1e040 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
1e050 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
1e060 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1e070 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
1e080 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
1e090 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e0a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
1e0b0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
1e0c0 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e  pPager;.  VVA_ON
1e0d0 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  LY( int nRef = s
1e0e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1e0f0 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a  unt(pPager); )..
1e100 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1e110 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1e120 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e  ->mutex) );.  in
1e130 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1e140 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1e150 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74   assert(pBt->aut
1e160 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20  oVacuum);.  if( 
1e170 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  !pBt->incrVacuum
1e180 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69   ){.    Pgno nFi
1e190 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
1e1a0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1e1b0 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
1e1c0 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f  autovacuuming */
1e1d0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b  .    Pgno nFree;
1e1e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e1f0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1e200 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69  e freelist initi
1e210 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ally */.    Pgno
1e220 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   iFree;        /
1e230 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20  * The next page 
1e240 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
1e250 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
1e260 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1e270 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
1e280 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
1e290 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
1e2a0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
1e2b0 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
1e2c0 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
1e2d0 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
1e2e0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1e2f0 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
1e300 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
1e310 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
1e320 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
1e330 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
1e340 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
1e350 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1e360 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
1e370 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
1e380 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
1e390 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
1e3a0 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
1e3b0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1e3c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1e3d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e3e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
1e3f0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
1e400 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e410 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20  [36]);.    nFin 
1e420 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1e430 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1e440 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e  ;.    if( nFin>n
1e450 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51  Orig ) return SQ
1e460 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e470 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c  T;.    if( nFin<
1e480 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72  nOrig ){.      r
1e490 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
1e4a0 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
1e4b0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72     }.    for(iFr
1e4c0 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
1e4d0 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
1e4e0 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
1e4f0 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
1e500 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1e510 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b  nFin, iFree, 1);
1e520 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1e530 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1e540 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
1e550 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
1e560 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e570 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
1e580 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
1e590 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
1e5a0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1e5b0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
1e5c0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e5d0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1e5e0 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
1e5f0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1e600 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1e610 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
1e620 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1e630 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74  e = 1;.      pBt
1e640 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a  ->nPage = nFin;.
1e650 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1e660 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e670 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1e680 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  rRollback(pPager
1e690 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1e6a0 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71  assert( nRef>=sq
1e6b0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
1e6c0 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  nt(pPager) );.  
1e6d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1e6e0 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51  lse /* ifndef SQ
1e6f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1e700 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65  CUUM */.# define
1e710 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1e720 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65  (x) SQLITE_OK.#e
1e730 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1e740 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
1e750 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66  e first phase of
1e760 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d   a two-phase com
1e770 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69  mit.  This routi
1e780 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72  ne.** causes a r
1e790 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
1e7a0 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69  to be created (i
1e7b0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c  f it does not al
1e7c0 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20  ready exist).** 
1e7d0 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69  and populated wi
1e7e0 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d  th enough inform
1e7f0 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66  ation so that if
1e800 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63   a power loss oc
1e810 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  curs.** the data
1e820 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74  base can be rest
1e830 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
1e840 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c  inal state by pl
1e850 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68  aying back.** th
1e860 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e  e journal.  Then
1e870 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1e880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65   the journal are
1e890 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a   flushed out to.
1e8a0 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66  ** the disk.  Af
1e8b0 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
1e8c0 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69  is safely on oxi
1e8d0 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20  de, the changes 
1e8e0 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  to the.** databa
1e8f0 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  se are written i
1e900 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
1e910 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65   file and flushe
1e920 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41  d to oxide..** A
1e930 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69  t the end of thi
1e940 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c  s call, the roll
1e950 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69  back journal sti
1e960 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  ll exists on the
1e970 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20  .** disk and we 
1e980 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e  are still holdin
1e990 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20  g all locks, so 
1e9a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1e9b0 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69  has not.** commi
1e9c0 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74  tted.  See sqlit
1e9d0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1e9e0 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20  seTwo() for the 
1e9f0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1ea00 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72  the.** commit pr
1ea10 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ocess..**.** Thi
1ea20 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
1ea30 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72  p if no write-tr
1ea40 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72  ansaction is cur
1ea50 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e  rently active on
1ea60 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65   pBt..**.** Othe
1ea70 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20  rwise, sync the 
1ea80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
1ea90 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e  r the btree pBt.
1eaa0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1eab0 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f  to.** the name o
1eac0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1ead0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1eae0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1eaf0 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76  nto the.** indiv
1eb00 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69  idual journal fi
1eb10 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20  le, or is NULL, 
1eb20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61  indicating no ma
1eb30 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1eb40 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61  e .** (single da
1eb50 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1eb60 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  on)..**.** When 
1eb70 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20  this is called, 
1eb80 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
1eb90 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64  al should alread
1eba0 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  y have been.** c
1ebb0 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65  reated, populate
1ebc0 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72  d with this jour
1ebd0 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20  nal pointer and 
1ebe0 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
1ebf0 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20  **.** Once this 
1ec00 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72  is routine has r
1ec10 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c  eturned, the onl
1ec20 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64  y thing required
1ec30 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68   to commit.** th
1ec40 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
1ec50 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74  ion for this dat
1ec60 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f  abase file is to
1ec70 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1ec80 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nal..*/.int sqli
1ec90 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1eca0 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c  aseOne(Btree *p,
1ecb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
1ecc0 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ster){.  int rc 
1ecd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1ece0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1ecf0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1ed00 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ed10 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71  = p->pBt;.    sq
1ed20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ed30 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p);.#ifndef SQLI
1ed40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1ed50 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
1ed60 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1ed70 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
1ed80 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a  uumCommit(pBt);.
1ed90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1eda0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1edb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1edc0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
1edd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ede0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1edf0 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61  ( pBt->bDoTrunca
1ee00 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  te ){.      sqli
1ee10 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1ee20 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65  Image(pBt->pPage
1ee30 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  r, pBt->nPage);.
1ee40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ee50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ee60 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1ee70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d  (pBt->pPager, zM
1ee80 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73  aster, 0);.    s
1ee90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1eea0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
1eeb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1eec0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1eed0 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68  called from both
1eee0 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73   BtreeCommitPhas
1eef0 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65  eTwo() and Btree
1ef00 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74  Rollback().** at
1ef10 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
1ef20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1ef30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1ef40 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1ef50 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a  tion(Btree *p){.
1ef60 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ef70 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
1ef80 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
1ef90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1efa0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1efb0 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66  x(p) );..#ifndef
1efc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1efd0 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62  OVACUUM.  pBt->b
1efe0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a  DoTruncate = 0;.
1eff0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e  #endif.  if( p->
1f000 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
1f010 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52  NE && db->nVdbeR
1f020 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  ead>1 ){.    /* 
1f030 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  If there are oth
1f040 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  er active statem
1f050 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  ents that belong
1f060 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73   to this databas
1f070 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c  e.    ** handle,
1f080 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20   downgrade to a 
1f090 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
1f0a0 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72  ction. The other
1f0b0 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20   statements.    
1f0c0 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20  ** may still be 
1f0d0 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65  reading from the
1f0e0 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20   database.  */. 
1f0f0 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53     downgradeAllS
1f100 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1f110 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e  ocks(p);.    p->
1f120 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
1f130 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  READ;.  }else{. 
1f140 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e     /* If the han
1f150 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64  dle had any kind
1f160 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   of transaction 
1f170 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20  open, decrement 
1f180 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e  the .    ** tran
1f190 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66  saction count of
1f1a0 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
1f1b0 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  e. If the transa
1f1c0 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20  ction count .   
1f1d0 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73   ** reaches 0, s
1f1e0 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1f1f0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e  ate to TRANS_NON
1f200 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72  E. The unlockBtr
1f210 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20  eeIfUnused().   
1f220 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77   ** call below w
1f230 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70  ill unlock the p
1f240 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ager.  */.    if
1f250 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
1f260 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
1f270 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64    clearAllShared
1f280 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
1f290 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  p);.      pBt->n
1f2a0 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20  Transaction--;. 
1f2b0 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d       if( 0==pBt-
1f2c0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
1f2d0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  .        pBt->in
1f2e0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1f2f0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  ANS_NONE;.      
1f300 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1f310 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Set the current 
1f320 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
1f330 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
1f340 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a  and unlock the .
1f350 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20      ** pager if 
1f360 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64  this call closed
1f370 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f   the only read o
1f380 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
1f390 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e  ion.  */.    p->
1f3a0 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
1f3b0 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  NONE;.    unlock
1f3c0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1f3d0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1f3e0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a  Integrity(p);.}.
1f3f0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68  ./*.** Commit th
1f400 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75  e transaction cu
1f410 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72  rrently in progr
1f420 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1f430 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
1f440 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68  ts the second ph
1f450 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65  ase of a 2-phase
1f460 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a   commit.  The.**
1f470 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f480 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f  mitPhaseOne() ro
1f490 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1f4a0 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73  irst phase and s
1f4b0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f  hould.** be invo
1f4c0 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  ked prior to cal
1f4d0 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
1f4e0 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42  e.  The sqlite3B
1f4f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1f500 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ne().** routine 
1f510 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b  did all the work
1f520 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f   of writing info
1f530 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64  rmation out to d
1f540 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67  isk and flushing
1f550 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1f560 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72   so that they ar
1f570 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74  e written onto t
1f580 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e  he disk platter.
1f590 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f    All this.** ro
1f5a0 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20  utine has to do 
1f5b0 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75  is delete or tru
1f5c0 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68  ncate or zero th
1f5d0 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a  e header in the.
1f5e0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
1f5f0 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63  journal (which c
1f600 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
1f610 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
1f620 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63   and.** drop loc
1f630 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  ks..**.** Normal
1f640 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
1f650 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
1f660 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20   pager layer is 
1f670 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a  attempting to .*
1f680 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75  * finalize the u
1f690 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61  nderlying journa
1f6a0 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e  l file, this fun
1f6b0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e  ction returns an
1f6c0 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68   error and.** th
1f6d0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69  e upper layer wi
1f6e0 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c  ll attempt a rol
1f6f0 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20  lback. However, 
1f700 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
1f710 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e  gument.** is non
1f720 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20  -zero then this 
1f730 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69  b-tree transacti
1f740 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  on is part of a 
1f750 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74  multi-file .** t
1f760 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74  ransaction. In t
1f770 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72  his case, the tr
1f780 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
1f790 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69  ready been commi
1f7a0 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c  tted .** (by del
1f7b0 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  eting a master j
1f7c0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
1f7d0 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
1f7e0 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a   ignore this .**
1f7f0 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
1f800 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e  n code. So, even
1f810 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1f820 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72  urs in the pager
1f830 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74   layer,.** reset
1f840 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65   the b-tree obje
1f850 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  cts internal sta
1f860 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  te to indicate t
1f870 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a  hat the write.**
1f880 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1f890 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68   been closed. Th
1f8a0 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65  is is quite safe
1f8b0 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77  , as the pager w
1f8c0 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e  ill have.** tran
1f8d0 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20  sitioned to the 
1f8e0 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a  error state..**.
1f8f0 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
1f900 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
1f910 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1f920 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
1f930 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1f940 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
1f950 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
1f960 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
1f970 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1f980 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
1f990 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43  Btree *p, int bC
1f9a0 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20  leanup){..  if( 
1f9b0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1f9c0 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20  S_NONE ) return 
1f9d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c  SQLITE_OK;.  sql
1f9e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f9f0 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  );.  btreeIntegr
1fa00 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ity(p);..  /* If
1fa10 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20   the handle has 
1fa20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
1fa30 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74  ion open, commit
1fa40 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
1fa50 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  es .  ** transac
1fa60 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65  tion and set the
1fa70 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f   shared state to
1fa80 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a   TRANS_READ..  *
1fa90 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1faa0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1fab0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1fac0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1fad0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
1fae0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1faf0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1fb00 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73  _WRITE );.    as
1fb10 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
1fb20 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
1fb30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fb40 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
1fb50 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
1fb60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1fb70 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70  E_OK && bCleanup
1fb80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
1fb90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1fba0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1fbb0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rc;.    }.    p-
1fbc0 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b  >iDataVersion--;
1fbd0 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20    /* Compensate 
1fbe0 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74  for pPager->iDat
1fbf0 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20  aVersion++; */. 
1fc00 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1fc10 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1fc20 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
1fc30 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
1fc40 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
1fc50 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1fc60 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1fc70 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1fc80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1fc90 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
1fca0 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
1fcb0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1fcc0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
1fcd0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1fce0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1fcf0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1fd00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1fd10 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
1fd20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1fd30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1fd40 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1fd50 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
1fd60 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1fd70 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1fd80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1fd90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1fda0 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
1fdb0 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
1fdc0 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
1fdd0 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
1fde0 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
1fdf0 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68  rsor on any BtSh
1fe00 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
1fe10 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20  .** references. 
1fe20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65   Or if the write
1fe30 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74  Only flag is set
1fe40 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79   to 1, then only
1fe50 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63  .** trip write c
1fe60 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65  ursors and leave
1fe70 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e   read cursors un
1fe80 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45  changed..**.** E
1fe90 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61  very cursor is a
1fea0 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65   candidate to be
1feb0 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64   tripped, includ
1fec0 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74  ing cursors.** t
1fed0 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74  hat belong to ot
1fee0 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
1fef0 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61  nections that ha
1ff00 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68  ppen to be.** sh
1ff10 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20  aring the cache 
1ff20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a  with pBtree..**.
1ff30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ff40 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  gets called when
1ff50 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1ff60 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65  rs. If the write
1ff70 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Only.** flag is 
1ff80 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  true, then only 
1ff90 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65  write-cursors ne
1ffa0 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20  ed be tripped - 
1ffb0 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72  read-only.** cur
1ffc0 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20  sors save their 
1ffd0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
1ffe0 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d  s so that they m
1fff0 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20  ay continue .** 
20000 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f  following the ro
20010 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77  llback. Or, if w
20020 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
20030 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  e, all cursors a
20040 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20  re .** tripped. 
20050 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74  In general, writ
20060 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69  eOnly is false i
20070 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
20080 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65  n being.** rolle
20090 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20  d back modified 
200a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
200b0 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ema. In this cas
200c0 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a  e b-tree root.**
200d0 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f   pages may be mo
200e0 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66  ved or deleted f
200f0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
20100 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b   altogether, mak
20110 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65  ing.** it unsafe
20120 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72   for read cursor
20130 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a  s to continue..*
20140 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74  *.** If the writ
20150 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72  eOnly flag is tr
20160 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ue and an error 
20170 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  is encountered w
20180 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20  hile .** saving 
20190 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
201a0 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f  tion of a read-o
201b0 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20  nly cursor, all 
201c0 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63  cursors, .** inc
201d0 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d  luding all read-
201e0 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
201f0 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ped..**.** SQLIT
20200 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20210 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
20220 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  or if an error o
20230 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73  ccurs while.** s
20240 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70  aving a cursor p
20250 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69  osition, an SQLi
20260 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
20270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20280 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
20290 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
202a0 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74  int errCode, int
202b0 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42   writeOnly){.  B
202c0 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e  tCursor *p;.  in
202d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
202e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72  ;..  assert( (wr
202f0 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72  iteOnly==0 || wr
20300 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42  iteOnly==1) && B
20310 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31  TCF_WriteFlag==1
20320 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65   );.  if( pBtree
20330 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
20340 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
20350 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74  );.    for(p=pBt
20360 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
20370 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
20380 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
20390 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 4f        if( writeO
203a0 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c  nly && (p->curFl
203b0 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
203c0 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Flag)==0 ){.    
203d0 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
203e0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
203f0 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  || p->eState==CU
20400 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b  RSOR_SKIPNEXT ){
20410 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
20420 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
20430 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  on(p);.         
20440 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20450 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
20460 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42    (void)sqlite3B
20470 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
20480 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30  rs(pBtree, rc, 0
20490 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
204a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
204b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
204c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
204d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
204e0 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
204f0 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
20500 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
20510 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65         p->skipNe
20520 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
20530 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
20540 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
20550 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
20560 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61  releasePage(p->a
20570 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20  pPage[i]);.     
20580 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20     p->apPage[i] 
20590 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
205a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
205b0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
205c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
205d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
205e0 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
205f0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
20600 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43  ..**.** If tripC
20610 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
20620 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72  E_OK then cursor
20630 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
20640 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e  dated (tripped).
20650 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
20660 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
20670 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
20680 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20  is true but all 
20690 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74  cursors are.** t
206a0 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
206b0 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41  nly is false.  A
206c0 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
206d0 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63  e.** a tripped c
206e0 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c  ursor will resul
206f0 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
20700 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
20710 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
20720 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20730 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
20740 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
20750 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
20760 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
20770 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
20780 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20790 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
207a0 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
207b0 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
207c0 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
207d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
207e0 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
207f0 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
20800 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d  sert( writeOnly=
20810 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =1 || writeOnly=
20820 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
20830 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
20840 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20  _ABORT_ROLLBACK 
20850 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  || tripCode==SQL
20860 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
20870 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
20880 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
20890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
208a0 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
208b0 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
208c0 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
208d0 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65    if( rc ) write
208e0 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Only = 0;.  }els
208f0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
20900 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
20910 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
20920 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
20930 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
20940 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64  rsors(p, tripCod
20950 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20  e, writeOnly);. 
20960 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
20970 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69  QLITE_OK || (wri
20980 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32  teOnly==0 && rc2
20990 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  ==SQLITE_OK) );.
209a0 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
209b0 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
209c0 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  2;.  }.  btreeIn
209d0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
209e0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
209f0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
20a00 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
20a10 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
20a20 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
20a30 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
20a40 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
20a50 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
20a60 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
20a70 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
20a80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
20a90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
20aa0 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
20ab0 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
20ac0 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
20ad0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
20ae0 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
20af0 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
20b00 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
20b10 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
20b20 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
20b30 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
20b40 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
20b50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
20b60 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
20b70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
20b80 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
20b90 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
20ba0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
20bb0 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
20bc0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
20bd0 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
20be0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
20bf0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
20c00 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
20c10 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
20c20 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
20c30 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
20c40 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
20c50 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
20c60 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
20c70 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  ( countValidCurs
20c80 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29  ors(pBt, 1)==0 )
20c90 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  ;.    pBt->inTra
20ca0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
20cb0 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
20cc0 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
20cd0 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
20ce0 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
20cf0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
20d00 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
20d10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20d20 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
20d30 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
20d40 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
20d50 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72  saction can be r
20d60 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
20d70 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
20d80 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
20d90 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
20da0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
20db0 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
20dc0 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
20dd0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
20de0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
20df0 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
20e00 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
20e10 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
20e20 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
20e30 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
20e40 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
20e50 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
20e60 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
20e70 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
20e80 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
20e90 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
20ea0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
20eb0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
20ec0 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
20ed0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
20ee0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
20ef0 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
20f00 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
20f10 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
20f20 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
20f30 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
20f40 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
20f50 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
20f60 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
20f70 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
20f80 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
20f90 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
20fa0 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
20fb0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
20fc0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
20fd0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
20fe0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
20ff0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
21000 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
21010 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
21020 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
21030 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
21040 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
21050 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
21060 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
21070 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
21080 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
21090 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
210a0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
210b0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
210c0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
210d0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
210e0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
210f0 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
21100 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
21110 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
21120 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
21130 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
21140 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21150 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
21160 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
21170 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
21180 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
21190 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
211a0 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
211b0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d   BTS_READ_ONLY)=
211c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
211d0 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
211e0 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
211f0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
21200 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
21210 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
21220 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
21230 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
21240 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
21250 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
21260 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
21270 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
21280 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
21290 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
212a0 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
212b0 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
212c0 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
212d0 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
212e0 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
212f0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
21300 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
21310 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
21320 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
21330 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
21340 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
21350 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
21360 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
21370 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
21380 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
21390 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
213a0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
213b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
213c0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
213d0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
213e0 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
213f0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
21400 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
21410 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
21420 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
21430 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
21440 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
21450 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
21460 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
21470 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
21480 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
21490 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
214a0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
214b0 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
214c0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
214d0 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
214e0 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
214f0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
21500 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
21510 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
21520 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
21530 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
21540 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
21550 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
21560 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
21570 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
21580 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
21590 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
215a0 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
215b0 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
215c0 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
215d0 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
215e0 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
215f0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
21600 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
21610 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
21620 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
21630 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
21640 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
21650 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
21660 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
21670 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
21680 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
21690 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
216a0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
216b0 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
216c0 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
216d0 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
216e0 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
216f0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
21700 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
21710 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
21720 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21730 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
21740 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
21750 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
21760 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
21780 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
21790 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
217a0 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45   BTS_INITIALLY_E
217b0 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  MPTY)!=0 ){.    
217c0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
217d0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
217e0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
217f0 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
21800 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
21810 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
21820 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
21830 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
21840 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
21850 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
21860 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
21870 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
21880 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
21890 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
218a0 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
218b0 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
218c0 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
218d0 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
218e0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
218f0 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
21900 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
21910 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
21920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21930 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
21940 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
21950 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
21960 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
21970 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
21980 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
21990 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
219a0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
219b0 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
219c0 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
219d0 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
219e0 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
219f0 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
21a00 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
21a10 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
21a20 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
21a30 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
21a40 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
21a50 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
21a60 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
21a70 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
21a80 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
21a90 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
21aa0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
21ab0 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
21ac0 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
21ad0 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
21ae0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
21af0 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
21b00 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
21b10 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
21b20 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
21b30 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
21b40 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
21b50 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
21b60 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
21b70 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
21b80 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
21b90 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
21ba0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
21bb0 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
21bc0 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
21bd0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
21be0 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
21bf0 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
21c00 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
21c10 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
21c20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
21c30 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
21c40 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
21c50 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
21c60 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
21c70 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
21c80 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
21c90 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
21ca0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
21cb0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
21cc0 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
21cd0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
21ce0 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
21cf0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
21d00 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
21d10 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
21d20 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
21d30 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
21d40 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
21d50 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
21d60 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
21d70 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
21d80 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
21d90 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
21da0 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
21db0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
21dc0 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
21dd0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
21de0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
21df0 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
21e00 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
21e10 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
21e20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
21e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
21e40 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
21e50 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
21e60 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
21e70 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
21e80 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
21e90 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
21ea0 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
21eb0 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
21ec0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ee0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
21ef0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
21f00 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
21f30 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
21f40 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
21f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
21f70 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
21f80 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
21f90 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
21fa0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
21fb0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
21fc0 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
21fd0 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
21fe0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22000 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
22010 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
22020 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
22030 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
22040 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
22050 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
22060 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
22070 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22090 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68  Looping over oth
220a0 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a  er all cursors *
220b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
220c0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
220d0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
220e0 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
220f0 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
22100 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
22110 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
22120 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
22130 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
22140 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
22150 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
22160 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
22170 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
22180 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
22190 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
221a0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
221b0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
221c0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
221d0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
221e0 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
221f0 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
22200 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
22210 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
22220 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
22230 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
22240 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
22250 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
22260 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
22270 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
22280 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
22290 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
222a0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
222b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
222c0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
222d0 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
222e0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
222f0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
22300 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
22310 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
22320 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
22330 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
22340 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28  ( wrFlag==0 || (
22350 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
22360 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
22370 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c  0 );..  if( wrFl
22380 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
22390 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
223a0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
223b0 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
223c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
223d0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  M;.  }.  if( iTa
223e0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
223f0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
22400 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22410 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
22420 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
22430 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
22440 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
22450 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
22460 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
22470 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
22480 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
22490 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
224a0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
224b0 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
224c0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
224d0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
224e0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
224f0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
22500 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
22510 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
22520 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
22530 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
22540 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
22550 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20  =BTCF_WriteFlag 
22560 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  );.  pCur->curFl
22570 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  ags = wrFlag;.  
22580 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
22590 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30  ags = wrFlag ? 0
225a0 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   : PAGER_GET_REA
225b0 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74  DONLY;.  /* If t
225c0 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
225d0 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
225e0 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
225f0 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20  then all such.  
22600 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74  ** cursors *must
22610 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f  * have the BTCF_
22620 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65  Multiple flag se
22630 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70  t. */.  for(pX=p
22640 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b  Bt->pCursor; pX;
22650 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
22660 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f      if( pX->pgno
22670 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62  Root==(Pgno)iTab
22680 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e  le ){.      pX->
22690 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
226a0 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20  _Multiple;.     
226b0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
226c0 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
226d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
226e0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
226f0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d  >pCursor;.  pBt-
22700 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
22710 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
22720 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
22730 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22740 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
22750 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
22760 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22790 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
227a0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
227d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
227e0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
227f0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
22820 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
22830 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
22840 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
22850 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
22860 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22870 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
22880 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
22890 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
228c0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
228d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
228e0 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20  ( iTable<1 ){.  
228f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
22900 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
22910 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
22920 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
22930 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72     rc = btreeCur
22940 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
22950 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
22960 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69   pCur);.    sqli
22970 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
22980 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22990 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
229a0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
229b0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
229c0 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
229d0 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
229e0 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
229f0 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
22a00 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
22a10 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
22a20 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
22a30 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
22a40 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
22a50 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
22a60 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
22a70 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
22a80 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
22a90 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
22aa0 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
22ab0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
22ac0 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
22ad0 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
22ae0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
22af0 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
22b00 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
22b10 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
22b20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
22b30 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
22b40 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
22b50 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
22b60 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
22b70 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
22b80 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
22b90 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
22ba0 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
22bb0 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
22bc0 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
22bd0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
22be0 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
22bf0 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
22c00 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
22c10 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
22c20 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
22c30 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
22c40 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
22c50 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
22c60 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
22c70 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
22c80 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
22c90 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
22ca0 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
22cb0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
22cc0 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
22cd0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
22ce0 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
22cf0 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
22d00 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
22d10 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
22d20 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
22d30 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
22d40 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
22d50 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
22d60 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
22d70 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
22d80 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
22d90 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
22da0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
22db0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
22dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22dd0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
22de0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
22df0 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  pBt->pCursor!=0 
22e00 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
22e10 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b  pCursor==pCur ){
22e20 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
22e30 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
22e40 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
22e50 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50      BtCursor *pP
22e60 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  rev = pBt->pCurs
22e70 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  or;.      do{.  
22e80 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d        if( pPrev-
22e90 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a  >pNext==pCur ){.
22ea0 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d            pPrev-
22eb0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
22ec0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
22ed0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
22ee0 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d  .        pPrev =
22ef0 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20   pPrev->pNext;. 
22f00 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57       }while( ALW
22f10 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20  AYS(pPrev) );.  
22f20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
22f30 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
22f40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
22f50 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
22f60 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
22f70 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
22f80 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
22f90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22fa0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
22fb0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
22fc0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
22fd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22fe0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
22ff0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
23000 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23010 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
23020 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
23030 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
23040 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
23050 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
23060 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
23070 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
23080 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
23090 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
230a0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
230b0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
230c0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
230d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
230e0 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
230f0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
23100 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
23110 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
23120 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
23130 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ell()..*/.#ifnde
23140 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
23150 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
23160 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
23170 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
23180 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
23190 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
231a0 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
231b0 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
231c0 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
231d0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
231e0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
231f0 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
23200 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
23210 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
23220 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28  PT_DB || memcmp(
23230 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
23240 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
23250 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
23260 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
23270 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
23280 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49  ndif.static SQLI
23290 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
232a0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
232b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
232c0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
232d0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Size==0 ){.    i
232e0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
232f0 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72  >iPage;.    pCur
23300 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
23310 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
23320 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
23330 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
23340 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
23350 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
23360 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
23370 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
23380 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  o(pCur);.  }.}..
23390 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
233a0 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
233b0 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
233c0 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
233d0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
233e0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
233f0 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
23400 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
23410 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
23420 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
23430 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
23440 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
23450 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
23460 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
23470 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
23480 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
23490 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
234a0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
234b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
234c0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
234d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
234e0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
234f0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
23500 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
23510 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
23520 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
23530 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
23540 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
23550 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
23560 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
23570 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
23580 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
23590 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
235a0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
235b0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
235c0 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
235d0 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
235e0 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
235f0 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
23600 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
23610 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
23620 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
23630 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
23640 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
23650 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
23660 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
23670 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
23680 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
23690 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
236a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
236b0 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
236c0 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
236d0 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
236e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
236f0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
23700 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
23710 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
23720 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
23730 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
23740 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23750 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
23760 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
23770 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  );.  *pSize = pC
23780 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
23790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
237a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
237b0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
237c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
237d0 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
237e0 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
237f0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
23800 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s to..**.** The 
23810 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
23820 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
23830 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
23840 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
23850 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
23860 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
23870 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
23880 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
23890 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
238a0 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
238b0 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
238c0 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
238d0 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
238e0 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66  ossible.  This f
238f0 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72  unction always r
23900 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
23910 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75  ..** It might ju
23920 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20  st as well be a 
23930 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72  procedure (retur
23940 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77  ning void) but w
23950 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f  e continue.** to
23960 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   return an integ
23970 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66  er result code f
23980 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65  or historical re
23990 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  asons..*/.int sq
239a0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
239b0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
239c0 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
239d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
239e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
239f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23a00 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23a10 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
23a20 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
23a30 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e>=0 );.  assert
23a40 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
23a50 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
23a60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23a70 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23a80 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c  >iPage]->intKeyL
23a90 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43  eaf==1 );.  getC
23aa0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
23ab0 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
23ac0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20  info.nPayload;. 
23ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23ae0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  K;.}../*.** Give
23af0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
23b00 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
23b10 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
23b20 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
23b30 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
23b40 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
23b50 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
23b60 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
23b70 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
23b80 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
23b90 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
23ba0 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
23bb0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
23bc0 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
23bd0 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
23be0 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
23bf0 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
23c00 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
23c10 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
23c20 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
23c30 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
23c40 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
23c50 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
23c60 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
23c70 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
23c80 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
23c90 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
23ca0 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
23cb0 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
23cc0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
23cd0 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
23ce0 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
23cf0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
23d00 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
23d10 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
23d20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
23d30 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
23d40 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
23d50 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
23d60 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
23d70 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
23d80 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
23d90 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
23da0 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
23db0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
23dc0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
23dd0 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
23de0 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
23df0 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
23e00 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
23e10 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
23e20 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
23e30 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
23e40 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
23e50 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
23e60 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
23e70 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
23e80 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
23e90 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
23ea0 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
23eb0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
23ec0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
23ed0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
23ee0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
23ef0 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
23f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
23f10 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
23f20 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
23f30 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
23f40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
23f50 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
23f60 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
23f70 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
23f80 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
23f90 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
23fa0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
23fb0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
23fc0 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
23fd0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
23fe0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
23ff0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
24000 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
24010 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
24020 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
24030 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
24040 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24050 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
24060 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
24070 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
24080 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
24090 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
240a0 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
240b0 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
240c0 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
240d0 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
240e0 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
240f0 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
24100 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
24110 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
24120 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
24130 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
24140 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
24150 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
24160 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
24170 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
24180 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
24190 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
241a0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
241b0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
241c0 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
241d0 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
241e0 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
241f0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
24200 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
24210 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
24220 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
24230 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
24240 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
24250 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65  Guess<=btreePage
24260 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
24270 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
24280 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
24290 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
242a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
242b0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
242c0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
242d0 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
242e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
242f0 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
24300 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
24310 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
24320 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
24330 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
24340 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
24350 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
24360 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24370 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
24380 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
24390 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d  pPage, (ppPage==
243a0 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  0) ? PAGER_GET_R
243b0 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
243c0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
243d0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
243e0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
243f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24400 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
24410 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
24420 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
24430 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
24440 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
24450 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
24460 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
24470 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
24480 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
24490 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
244a0 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
244b0 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
244c0 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
244d0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
244e0 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
244f0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
24500 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
24510 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
24520 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
24530 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
24540 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
24550 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
24560 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
24570 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
24580 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
24590 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
245a0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
245b0 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
245c0 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
245d0 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
245e0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
245f0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
24600 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
24610 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
24620 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
24630 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
24640 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
24650 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
24660 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
24670 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
24680 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
24690 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
246a0 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
246b0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
246c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
246d0 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
246e0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
246f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24700 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
24710 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
24720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24730 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
24740 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
24750 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24760 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
24770 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
24780 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
24790 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
247a0 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
247b0 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
247c0 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
247d0 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
247e0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
247f0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
24800 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
24810 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
24820 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24830 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
24840 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
24860 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24870 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
24880 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
24890 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
248a0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
248b0 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
248c0 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
248d0 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
248e0 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
248f0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
24900 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24920 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
24930 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
24940 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
24950 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
24960 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
24970 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
24980 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
24990 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d  The eOp.** argum
249a0 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74  ent is interpret
249b0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
249c0 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70  *.**   0: The op
249d0 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
249e0 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  d. Populate the 
249f0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
24a00 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72  **   1: The oper
24a10 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65  ation is a write
24a20 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
24a30 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
24a40 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61  *   2: The opera
24a50 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
24a60 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20  Do not populate 
24a70 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
24a80 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  he..**.** A tota
24a90 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
24aa0 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
24ab0 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
24ac0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
24ad0 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
24ae0 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
24af0 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
24b00 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
24b10 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
24b20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20  might appear on 
24b30 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a  the main page.**
24b40 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
24b50 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
24b60 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
24b70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
24b80 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
24b90 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
24ba0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
24bb0 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f  es and the.** eO
24bc0 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  p argument is no
24bd0 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69  t 2, this functi
24be0 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20  on may allocate 
24bf0 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
24c00 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74  zily .** populat
24c10 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
24c20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
24c30 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
24c40 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
24c50 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
24c60 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
24c70 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
24c80 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
24c90 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
24ca0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
24cb0 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
24cc0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
24cd0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
24ce0 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
24cf0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
24d00 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
24d10 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
24d20 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
24d30 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
24d40 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
24d50 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
24d60 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
24d70 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
24d80 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
24d90 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
24da0 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
24db0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
24dc0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
24dd0 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
24de0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
24df0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
24e00 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
24e10 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
24e20 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
24e30 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
24e40 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
24e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24e60 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
24e70 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
24e80 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
24e90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
24ea0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
24eb0 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
24ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
24ed0 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
24ee0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
24ef0 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
24f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
24f10 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
24f20 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
24f30 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
24f40 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
24f50 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
24f60 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
24f70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
24f80 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
24f90 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
24fa0 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
24fb0 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
24fc0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24fd0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78  E_OK;.  int iIdx
24fe0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
24ff0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
25000 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25010 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67  e]; /* Btree pag
25020 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
25030 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
25040 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
25050 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
25060 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
25070 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
25080 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   to */.#ifdef SQ
25090 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
250a0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69  FLOW_READ.  unsi
250b0 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73  gned char * cons
250c0 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42  t pBufStart = pB
250d0 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20  uf;.  int bEnd; 
250e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25100 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69  /* True if readi
25110 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74  ng to end of dat
25120 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  a */.#endif..  a
25130 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
25140 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25150 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25160 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
25170 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
25180 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
25190 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
251a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
251b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
251c0 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
251d0 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20  || offset==0 ); 
251e0 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61     /* Always sta
251f0 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e  rt from beginnin
25200 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a  g for eOp==2 */.
25210 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
25220 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
25230 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   = pCur->info.pP
25240 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53  ayload;.#ifdef S
25250 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
25260 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e  RFLOW_READ.  bEn
25270 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d  d = offset+amt==
25280 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
25290 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  oad;.#endif.  as
252a0 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
252b0 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
252c0 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66  Payload );..  if
252d0 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  ( &aPayload[pCur
252e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
252f0 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
25300 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20  Bt->usableSize] 
25310 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
25320 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
25330 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
25340 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
25350 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
25360 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
25370 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
25380 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
25390 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
253a0 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
253b0 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
253c0 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
253d0 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
253e0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
253f0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
25400 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
25410 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
25420 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
25430 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
25440 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
25450 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
25460 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
25470 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28  set], pBuf, a, (
25480 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61  eOp & 0x01), pPa
25490 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
254a0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
254b0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
254c0 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
254d0 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
254e0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
254f0 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28  cal;.  }...  if(
25500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25510 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
25520 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
25530 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
25540 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
25550 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
25560 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
25570 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
25580 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
25590 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
255a0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
255b0 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  cal]);..    /* I
255c0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  f the BtCursor.a
255d0 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e  Overflow[] has n
255e0 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
255f0 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
25600 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70  ow..    ** Excep
25610 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61  t, do not alloca
25620 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66  te aOverflow[] f
25630 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a  or eOp==2..    *
25640 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76  *.    ** The aOv
25650 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69  erflow[] array i
25660 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65  s sized at one e
25670 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
25680 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
25690 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ** in the overfl
256a0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
256b0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
256c0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
256d0 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73  page is.    ** s
256e0 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
256f0 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61  ow[0], etc. A va
25700 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
25710 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
25720 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22  y.    ** means "
25730 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28  not yet known" (
25740 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
25750 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
25760 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
25770 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e  Op!=2 && (pCur->
25780 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
25790 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b  ValidOvfl)==0 ){
257a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
257b0 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
257c0 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
257d0 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
257e0 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
257f0 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e        if( nOvfl>
25800 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63  pCur->nOvflAlloc
25810 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
25820 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29   *aNew = (Pgno*)
25830 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a  sqlite3Realloc(.
25840 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
25850 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76  ->aOverflow, nOv
25860 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  fl*2*sizeof(Pgno
25870 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
25880 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
25890 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
258a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
258b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
258c0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
258d0 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76  nOvflAlloc = nOv
258e0 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  fl*2;.          
258f0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
25900 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
25910 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
25920 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25930 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  K ){.        mem
25940 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
25950 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
25960 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
25970 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
25980 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
25990 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  dOvfl;.      }. 
259a0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
259b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
259c0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
259d0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
259e0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
259f0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
25a00 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
25a10 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
25a20 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
25a30 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
25a40 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
25a50 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25a60 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
25a70 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72  !=0.     && pCur
25a80 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
25a90 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20  et/ovflSize].   
25aa0 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
25ab0 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
25ac0 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
25ad0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
25ae0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
25af0 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
25b00 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
25b10 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20    }..    for( ; 
25b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25b30 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
25b40 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20  ge; iIdx++){..  
25b50 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
25b60 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
25b70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
25b80 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
25b90 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
25ba0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
25bb0 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a  alidOvfl)!=0 ){.
25bc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
25bd0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
25be0 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
25bf0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
25c00 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
25c10 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
25c20 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
25c30 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
25c40 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
25c50 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
25c60 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
25c70 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
25c80 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
25c90 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
25ca0 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
25cb0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
25cc0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
25cd0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
25ce0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
25cf0 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
25d00 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
25d10 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
25d20 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
25d30 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
25d40 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
25d50 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
25d60 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
25d70 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
25d80 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
25d90 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
25da0 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76  ote that the aOv
25db0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
25dc0 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
25dd0 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a   because eOp!=2.
25de0 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e          ** here.
25df0 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65    If eOp==2, the
25e00 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20  n offset==0 and 
25e10 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e  this branch is n
25e20 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20  ever taken..    
25e30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
25e40 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b  ssert( eOp!=2 );
25e50 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
25e60 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
25e70 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
25e80 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
25e90 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
25ea0 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
25eb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
25ec0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
25ed0 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
25ee0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
25ef0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
25f00 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
25f10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
25f20 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
25f30 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
25f40 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
25f50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25f60 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
25f70 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
25f80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
25f90 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
25fa0 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
25fb0 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
25fc0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
25fd0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
25fe0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
25ff0 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
26000 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
26010 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
26020 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
26030 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
26040 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26050 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69  _file *fd;.#endi
26060 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
26070 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
26080 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
26090 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
260a0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
260b0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
260c0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
260d0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
260e0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
260f0 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
26100 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
26110 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
26120 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
26130 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
26140 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
26150 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
26160 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
26170 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
26180 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
26190 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
261a0 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61    **   3) the da
261b0 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62  tabase is file-b
261c0 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20  acked, and.     
261d0 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65     **   4) there
261e0 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74   is no open writ
261f0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e-transaction, a
26200 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
26210 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  5) the database 
26220 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74  is not a WAL dat
26230 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a  abase,.        *
26240 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20  *   6) all data 
26250 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73  from the page is
26260 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20   being read..   
26270 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20       **   7) at 
26280 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
26290 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
262a0 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
262b0 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
262c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
262d0 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
262e0 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
262f0 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
26300 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
26310 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
26320 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
26330 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
26340 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
26350 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
26360 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
26370 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
26380 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
26390 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
263a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
263b0 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31     if( (eOp&0x01
263c0 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )==0            
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
263f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
26400 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26430 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
26440 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c        && (bEnd |
26450 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20  | a==ovflSize)  
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26480 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  6) */.         &
26490 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
264a0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44  tion==TRANS_READ
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264c0 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
264d0 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d          && (fd =
264e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
264f0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d  e(pBt->pPager))-
26500 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a  >pMethods     /*
26510 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
26520 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
26530 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31  >aData[19]==0x01
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26550 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f         /* (5) */
26560 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42  .         && &pB
26570 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72  uf[-4]>=pBufStar
26580 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20  /* (7) */.      
265b0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
265c0 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
265d0 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
265e0 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
265f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26600 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72  aWrite>=pBufStar
26610 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  t );            
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26630 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20  hence (7) */.   
26640 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53         memcpy(aS
26650 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b  ave, aWrite, 4);
26660 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26670 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
26680 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28  , aWrite, a+4, (
26690 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  i64)pBt->pageSiz
266a0 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b  e*(nextPage-1));
266b0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
266c0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
266d0 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
266e0 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c    memcpy(aWrite,
266f0 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20   aSave, 4);.    
26700 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
26710 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ..        {.    
26720 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
26730 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  bPage;.         
26740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26750 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
26760 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
26770 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
26780 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30           ((eOp&0
26790 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  x01)==0 ? PAGER_
267a0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
267b0 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
267c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
267d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
267e0 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
267f0 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
26800 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
26810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
26820 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
26830 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
26840 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
26850 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
26860 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
26870 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78  pBuf, a, (eOp&0x
26880 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  01), pDbPage);. 
26890 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
268a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
268b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
268c0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
268d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
268e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
268f0 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
26900 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
26910 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
26920 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26930 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
26940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
26950 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
26960 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26970 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
26980 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
26990 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
269a0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
269b0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
269c0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
269d0 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  rred into pBuf[]
269e0 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
269f0 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
26a00 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fset"..**.** The
26a10 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
26a20 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ure that pCur is
26a30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
26a40 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74  alid row.** in t
26a50 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
26a60 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
26a70 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
26a80 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
26a90 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
26aa0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
26ab0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
26ac0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
26ad0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
26ae0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
26af0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
26b00 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
26b10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
26b20 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
26b30 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
26b40 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26b50 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
26b70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26b80 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
26b90 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
26ba0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
26bb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26bc0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
26bd0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26be0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
26bf0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26c00 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
26c10 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
26c20 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
26c30 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
26c40 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
26c50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
26c60 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
26c70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
26c80 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
26c90 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
26ca0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
26cb0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
26cc0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
26cd0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
26ce0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
26cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
26d00 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
26d10 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
26d20 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
26d30 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
26d40 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
26d50 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
26d60 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
26d70 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
26d80 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
26d90 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
26da0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
26db0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
26dc0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
26dd0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
26de0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
26df0 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
26e00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26e10 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
26e20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26e30 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
26e40 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
26e50 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26e60 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
26e70 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
26e80 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
26e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26ea0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
26eb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26ec0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
26ed0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
26ee0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
26ef0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26f00 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
26f10 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
26f20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
26f30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26f40 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
26f50 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
26f60 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
26f70 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
26f80 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
26f90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
26fa0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
26fb0 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
26fc0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
26fd0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
26fe0 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
26ff0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
27000 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
27010 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
27020 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
27030 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70   index btrees (p
27040 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29  Page->intKey==0)
27050 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61   and is the data
27060 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74   for.** table bt
27070 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
27080 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d  Key==1). The num
27090 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
270a0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79  available.** key
270b0 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
270c0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
270d0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
270e0 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74  the value.** ret
270f0 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
27100 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  e a valid pointe
27110 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
27120 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
27130 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
27140 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
27150 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
27160 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
27170 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
27180 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
27190 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
271a0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
271b0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
271c0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
271d0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
271e0 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
271f0 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
27200 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
27210 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
27220 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
27230 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
27240 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
27250 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
27260 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
27270 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
27280 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
27290 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
272a0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
272b0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
272c0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
272d0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
272e0 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
272f0 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
27300 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
27310 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
27320 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
27330 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
27340 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
27350 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
27360 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66  ic const void *f
27370 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
27380 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
27390 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
273a0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
273b0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
273c0 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20    u32 *pAmt     
273d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
273e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
273f0 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
27400 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61  re */.){.  u32 a
27410 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  mt;.  assert( pC
27420 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
27430 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
27440 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27450 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
27460 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27470 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
27480 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27490 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
274a0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
274b0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
274c0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
274d0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
274e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
274f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
27500 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27510 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
27520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27530 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
27540 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27550 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27560 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  >pCur->apPage[pC
27570 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
27580 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
27590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
275a0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
275b0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
275c0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
275d0 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
275e0 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74  B);.  amt = (int
275f0 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  )(pCur->apPage[p
27600 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27610 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
27620 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20  fo.pPayload);.  
27630 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
27640 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20  Local<amt ) amt 
27650 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
27660 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61  cal;.  *pAmt = a
27670 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
27680 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
27690 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
276a0 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
276b0 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
276c0 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
276d0 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
276e0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
276f0 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
27700 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
27710 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
27720 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
27730 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
27740 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
27750 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
27760 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
27770 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
27780 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
27790 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
277a0 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
277b0 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
277c0 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
277d0 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
277e0 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
277f0 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
27800 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
27810 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
27820 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
27830 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
27840 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
27850 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
27860 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
27870 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
27880 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
27890 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
278a0 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
278b0 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
278c0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
278d0 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
278e0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
278f0 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
27900 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
27910 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
27920 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
27930 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
27940 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
27950 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
27960 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
27970 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a  ur, u32 *pAmt){.
27980 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61    return fetchPa
27990 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
279a0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  );.}.../*.** Mov
279b0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
279c0 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
279d0 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
279e0 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
279f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
27a00 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
27a10 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
27a20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
27a30 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
27a40 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74  ITE_CORRUPT if t
27a50 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  he page-header f
27a60 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a  lags field of.**
27a70 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
27a80 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  age does not mat
27a90 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65  ch the flags fie
27aa0 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
27ab0 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20   (i.e..** if an 
27ac0 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65  intkey page appe
27ad0 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61  ars to be the pa
27ae0 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e  rent of a non-in
27af0 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a  tkey page, or.**
27b00 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f   vice-versa)..*/
27b10 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
27b20 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
27b30 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
27b40 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64  gno){.  BtShared
27b50 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
27b60 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
27b70 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
27b80 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
27b90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
27ba0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
27bb0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27bc0 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
27bd0 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
27be0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
27bf0 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e>=0 );.  if( pC
27c00 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
27c10 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
27c20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
27c30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27c40 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  KPT;.  }.  pCur-
27c50 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
27c60 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
27c70 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
27c80 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
27c90 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69  Ovfl);.  pCur->i
27ca0 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e  Page++;.  pCur->
27cb0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27cc0 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e] = 0;.  return
27cd0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
27ce0 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
27cf0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27d00 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20  ->iPage],.      
27d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63 75    pCur, pCur->cu
27d30 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a  rPagerFlags);.}.
27d40 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
27d50 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
27d60 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
27d70 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
27d80 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
27d90 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
27da0 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
27db0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
27dc0 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
27dd0 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
27de0 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
27df0 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
27e00 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
27e10 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
27e20 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
27e30 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
27e40 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
27e50 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
27e60 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
27e70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27e80 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
27e90 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
27ea0 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
27eb0 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69  gno iChild){.  i
27ec0 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
27ed0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
27ee0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65  conditions teste
27ef0 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f  d below might no
27f00 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20  t be true.      
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f        ** in a co
27f30 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a  rrupt database *
27f40 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  /.  assert( iIdx
27f50 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
27f60 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
27f70 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
27f80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
27f90 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
27fa0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
27fb0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
27fc0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
27fd0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
27fe0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
27ff0 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
28000 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
28010 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
28020 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
28030 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
28040 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
28050 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
28060 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
28070 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
28080 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
28090 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
280a0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
280b0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
280c0 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
280d0 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
280e0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
280f0 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
28100 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
28110 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
28120 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
28130 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
28140 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
28150 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
28160 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
28170 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
28180 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
28190 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
281a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
281b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
281c0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
281d0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
281e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
281f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28200 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50  ge] );.  assertP
28210 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
28220 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28230 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
28240 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
28250 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
28260 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
28270 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
28280 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61  no.  );.  testca
28290 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  se( pCur->aiIdx[
282a0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e  pCur->iPage-1] >
282b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
282c0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43  ur->iPage-1]->nC
282d0 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ell );.  pCur->i
282e0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
282f0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
28300 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
28310 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
28320 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  fl);.  releasePa
28330 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
28340 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28350 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge--]);.}../*.**
28360 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
28370 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
28380 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74   root page of it
28390 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  s b-tree structu
283a0 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
283b0 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72   table has a vir
283c0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20  tual root page, 
283d0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
283e0 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e  is moved to poin
283f0 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74  t.** to the virt
28400 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e  ual root page in
28410 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74  stead of the act
28420 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41  ual root page. A
28430 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20   table has a.** 
28440 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
28450 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61  e when the actua
28460 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74  l root page cont
28470 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e  ains no cells an
28480 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63  d a .** single c
28490 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20  hild page. This 
284a0 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
284b0 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72  with the table r
284c0 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e  ooted at page 1.
284d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d  .**.** If the b-
284e0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
284f0 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72  s empty, the cur
28500 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
28510 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49   to .** CURSOR_I
28520 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69 73  NVALID. Otherwis
28530 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  e, the cursor is
28540 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
28550 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63 65   the first.** ce
28560 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68  ll located on th
28570 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74 75  e root (or virtu
28580 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
28590 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
285a0 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  te.** is set to 
285b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
285c0 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
285d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63  tion returns suc
285e0 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61  cessfully, it ma
285f0 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61  y be assumed tha
28600 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65  t the.** page-he
28610 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63  ader flags indic
28620 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69  ate that the [vi
28630 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65  rtual] root-page
28640 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64   is the expected
28650 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74   .** kind of b-t
28660 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69  ree page (i.e. i
28670 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  f when opening t
28680 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61  he cursor the ca
28690 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20  ller did not.** 
286a0 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
286b0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  o structure the 
286c0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
286d0 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30  t to 0x05 or 0x0
286e0 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  D,.** indicating
286f0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
28700 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65   or if the calle
28710 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20  r did specify a 
28720 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75  KeyInfo .** stru
28730 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
28740 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
28750 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64  x02 or 0x0A, ind
28760 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78  icating an index
28770 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a  .** b-tree)..*/.
28780 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
28790 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
287a0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
287b0 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
287c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
287d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
287e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
287f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
28800 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43  RSOR_INVALID < C
28810 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28820 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
28830 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20  URSOR_VALID   < 
28840 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
28850 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
28860 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e  CURSOR_FAULT   >
28870 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
28880 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
28890 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
288a0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b  R_REQUIRESEEK ){
288b0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
288c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
288d0 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ULT ){.      ass
288e0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
288f0 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
28900 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
28910 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
28920 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
28930 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
28940 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
28950 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
28960 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
28970 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
28980 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28990 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
289a0 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20  iPage]!=0 );.   
289b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
289c0 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
289d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
289e0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ]);.    }.  }els
289f0 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
28a00 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
28a10 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28a20 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
28a30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28a40 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
28a50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28a60 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20  Page==(-1) );.  
28a70 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
28a80 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72  tPage(pCur->pBtr
28a90 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70  ee->pBt, pCur->p
28aa0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
28ab0 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20  apPage[0],.     
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50     0, pCur->curP
28ae0 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20  agerFlags);.    
28af0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28b00 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
28b10 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
28b20 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
28b30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
28b40 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
28b50 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
28b60 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72  curIntKey = pCur
28b70 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
28b80 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  Key;.  }.  pRoot
28b90 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
28ba0 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
28bb0 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
28bc0 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
28bd0 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
28be0 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
28bf0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
28c00 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
28c10 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
28c20 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
28c30 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
28c40 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
28c50 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
28c60 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
28c70 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
28c80 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
28c90 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
28ca0 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
28cb0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
28cc0 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
28cd0 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
28ce0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
28cf0 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
28d00 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
28d10 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
28d20 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
28d30 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
28d40 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
28d50 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
28d60 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
28d70 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
28d80 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
28d90 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
28da0 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
28db0 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
28dc0 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
28dd0 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
28de0 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
28df0 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
28e00 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
28e10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
28e20 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
28e30 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
28e40 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
28e50 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
28e60 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
28e70 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
28e80 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
28e90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
28ea0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43  _BKPT;.  }..  pC
28eb0 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
28ec0 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
28ed0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
28ee0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
28ef0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
28f00 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
28f10 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69  ValidOvfl);..  i
28f20 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e  f( pRoot->nCell>
28f30 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
28f40 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
28f50 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ALID;.  }else if
28f60 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  ( !pRoot->leaf )
28f70 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
28f80 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f  ge;.    if( pRoo
28f90 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74  t->pgno!=1 ) ret
28fa0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
28fb0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62  PT_BKPT;.    sub
28fc0 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
28fd0 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
28fe0 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
28ff0 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  ]);.    pCur->eS
29000 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
29010 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  LID;.    rc = mo
29020 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
29030 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73  subpage);.  }els
29040 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  e{.    pCur->eSt
29050 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
29060 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ALID;.  }.  retu
29070 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29080 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29090 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74  down to the left
290a0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
290b0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
290c0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 69  entry to which i
290d0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
290e0 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  ointing..**.** T
290f0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61  he left-most lea
29100 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  f is the one wit
29110 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b  h the smallest k
29120 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a  ey - the first.*
29130 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  * in ascending o
29140 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
29150 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  int moveToLeftmo
29160 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
29170 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
29180 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29190 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
291a0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
291b0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
291c0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
291d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
291e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
291f0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
29200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
29210 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
29220 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29230 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
29240 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29250 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29260 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
29270 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
29280 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
29290 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
292a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
292b0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
292c0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
292d0 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
292e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
292f0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
29300 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
29310 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
29320 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
29330 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
29340 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
29350 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
29360 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
29370 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
29380 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
29390 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
293a0 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
293b0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
293c0 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
293d0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
293e0 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
293f0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
29400 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
29410 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
29420 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
29430 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
29440 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
29450 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
29460 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
29470 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
29480 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
29490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
294a0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
294b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
294c0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
294d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
294e0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
294f0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
29500 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
29510 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
29520 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29530 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29540 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
29550 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
29560 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29570 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
29580 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
29590 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
295a0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
295b0 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
295c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
295d0 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  e] = pPage->nCel
295e0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  l;.    rc = move
295f0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
29600 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
29610 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
29620 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
29630 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
29640 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
29650 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
29660 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
29670 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
29680 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
29690 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b  ValidNKey)==0 );
296a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
296b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20  _OK;.}../* Move 
296c0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
296d0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
296e0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
296f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
29700 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
29710 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
29720 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
29730 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
29740 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
29750 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
29760 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
29770 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
29780 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
29790 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
297a0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
297b0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
297c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
297d0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
297e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
297f0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
29800 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
29810 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
29820 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
29830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29840 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
29850 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
29860 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61  VALID ){.      a
29870 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
29880 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
29890 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
298a0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
298b0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
298c0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
298d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
298e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
298f0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20  iPage]->nCell>0 
29900 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
29910 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   0;.      rc = m
29920 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
29930 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ur);.    }.  }. 
29940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29950 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
29960 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  r to the last en
29970 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
29980 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
29990 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
299a0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
299b0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
299c0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
299d0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
299e0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
299f0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
29a00 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
29a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
29a20 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
29a30 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
29a40 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65  int rc;. .  asse
29a50 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
29a60 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
29a70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29a80 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
29a90 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
29aa0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
29ab0 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
29ac0 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
29ad0 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
29ae0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
29af0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
29b00 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
29b10 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  e && (pCur->curF
29b20 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
29b30 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66  st)!=0 ){.#ifdef
29b40 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
29b50 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
29b60 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
29b70 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
29b80 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
29b90 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
29ba0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
29bb0 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
29bc0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
29bd0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
29be0 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
29bf0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
29c00 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
29c10 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
29c20 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
29c30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
29c40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29c50 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
29c60 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29c70 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
29c80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29c90 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29ca0 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
29cb0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
29cc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
29cd0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
29ce0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
29cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29d00 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
29d10 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
29d20 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
29d30 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
29d40 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
29d50 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29d60 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
29d70 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
29d80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29d90 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29da0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29db0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
29dc0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
29dd0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
29de0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
29df0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29e00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
29e10 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
29e20 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
29e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29e40 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
29e50 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73  s &= ~BTCF_AtLas
29e60 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20  t;.      }.   . 
29e70 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
29e80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
29e90 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
29ea0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
29eb0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
29ec0 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
29ed0 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
29ee0 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
29ef0 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
29f00 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
29f10 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
29f20 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
29f30 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
29f40 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
29f50 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
29f60 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
29f70 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
29f80 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
29f90 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
29fa0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
29fb0 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
29fc0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
29fd0 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
29fe0 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
29ff0 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
2a000 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
2a010 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
2a020 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
2a030 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
2a040 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
2a050 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
2a060 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
2a070 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
2a080 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2a090 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
2a0a0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
2a0b0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
2a0c0 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
2a0d0 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
2a0e0 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
2a0f0 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
2a100 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
2a110 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
2a120 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
2a130 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2a140 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
2a150 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2a160 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a170 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a190 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
2a1a0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
2a1b0 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
2a1c0 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
2a1e0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
2a1f0 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
2a200 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
2a210 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
2a220 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
2a230 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2a240 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2a250 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2a260 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
2a270 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
2a280 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
2a290 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
2a2a0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2a2b0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2a2c0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2a2e0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
2a2f0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2a300 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2a310 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2a320 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2a330 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
2a340 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
2a350 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
2a360 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
2a370 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
2a380 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
2a390 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
2a3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2a3b0 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
2a3c0 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
2a3d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2a3e0 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
2a3f0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
2a400 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
2a410 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
2a420 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
2a430 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
2a440 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2a450 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
2a460 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
2a470 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2a480 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2a490 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2a4a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2a4b0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2a4c0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2a4d0 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b   assert( pRes );
2a4e0 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78  .  assert( (pIdx
2a4f0 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e  Key==0)==(pCur->
2a500 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a  pKeyInfo==0) );.
2a510 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2a520 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2a530 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
2a540 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
2a550 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
2a560 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
2a570 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
2a580 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
2a590 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
2a5a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a5b0 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  D && (pCur->curF
2a5c0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2a5d0 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20 26 26 20  dNKey)!=0.   && 
2a5e0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2a5f0 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  .  ){.    if( pC
2a600 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69  ur->info.nKey==i
2a610 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2a620 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2a630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a650 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2a660 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2a670 30 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0 && pCur->info.
2a680 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
2a690 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
2a6a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2a6b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2a6c0 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65   }..  if( pIdxKe
2a6d0 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  y ){.    xRecord
2a6e0 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
2a6f0 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
2a700 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70  (pIdxKey);.    p
2a710 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2a720 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2a730 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2a740 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20  t_rc==1 .       
2a750 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2a760 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20  fault_rc==0 .   
2a770 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2a780 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  ->default_rc==-1
2a790 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
2a7a0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2a7b0 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20  are = 0; /* All 
2a7c0 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72  keys are integer
2a7d0 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  s */.  }..  rc =
2a7e0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2a7f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2a800 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2a810 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
2a820 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2a830 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a840 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
2a850 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2a860 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2a870 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a880 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
2a890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2a8a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a8b0 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
2a8c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2a8d0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
2a8e0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2a8f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2a900 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
2a910 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
2a920 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2a930 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2a940 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a950 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
2a960 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a970 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
2a980 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
2a990 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75  [0]->intKey==pCu
2a9a0 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a  r->curIntKey );.
2a9b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a9c0 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64  curIntKey || pId
2a9d0 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
2a9e0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
2a9f0 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
2aa00 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
2aa10 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2aa20 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2aa30 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2aa40 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa60 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2aa70 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
2aa80 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
2aa90 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c    /* pPage->nCel
2aaa0 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  l must be greate
2aab0 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20  r than zero. If 
2aac0 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74  this is the root
2aad0 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65  -page.    ** the
2aae0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61   cursor would ha
2aaf0 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20  ve been INVALID 
2ab00 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66  above and this f
2ab10 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20  or(;;) loop.    
2ab20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74  ** not run. If t
2ab30 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72  his is not the r
2ab40 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74  oot-page, then t
2ab50 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29  he moveToChild()
2ab60 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
2ab70 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  would have alrea
2ab80 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63  dy detected db c
2ab90 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c  orruption. Simil
2aba0 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74  arly, pPage must
2abb0 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72  .    ** be the r
2abc0 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78  ight kind (index
2abd0 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d   or table) of b-
2abe0 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72  tree page. Other
2abf0 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f  wise.    ** a mo
2ac00 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d  veToChild() or m
2ac10 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c  oveToRoot() call
2ac20 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
2ac30 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e  cted corruption.
2ac40 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2ac50 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
2ac60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2ac70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70  Page->intKey==(p
2ac80 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20  IdxKey==0) );.  
2ac90 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
2aca0 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
2acb0 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l-1;.    assert(
2acc0 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c   biasRight==0 ||
2acd0 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b   biasRight==1 );
2ace0 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e  .    idx = upr>>
2acf0 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f  (1-biasRight); /
2ad00 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68  * idx = biasRigh
2ad10 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75  t ? upr : (lwr+u
2ad20 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43  pr)/2; */.    pC
2ad30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2ad40 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2ad50 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f  x;.    if( xReco
2ad60 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a  rdCompare==0 ){.
2ad70 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
2ad80 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
2ad90 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65  Key;.        pCe
2ada0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73  ll = findCellPas
2adb0 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29  tPtr(pPage, idx)
2adc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
2add0 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
2ade0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ){.          whi
2adf0 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43  le( 0x80 <= *(pC
2ae00 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20  ell++) ){.      
2ae10 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e        if( pCell>
2ae20 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
2ae30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2ae40 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2ae50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ae60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
2ae70 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
2ae80 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
2ae90 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2aea0 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey<intKey ){. 
2aeb0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2aec0 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx+1;.          
2aed0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2aee0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = -1; break; }.
2aef0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2af00 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65  ( nCellKey>intKe
2af10 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  y ){.          u
2af20 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20  pr = idx-1;.    
2af30 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2af40 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65  r ){ c = +1; bre
2af50 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2af60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2af70 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d  ssert( nCellKey=
2af80 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20  =intKey );.     
2af90 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2afa0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
2afb0 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  dNKey;.         
2afc0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2afd0 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
2afe0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2aff0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2b000 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2b010 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
2b020 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2b030 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
2b040 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2b050 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  o moveto_next_la
2b060 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  yer;.          }
2b070 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2b080 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2b090 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2b0a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2b0b0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2b0c0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2b0d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2b0e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2b0f0 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
2b100 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
2b110 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
2b120 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   = (lwr+upr)/2; 
2b130 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2b140 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
2b150 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ;;){.        int
2b160 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65   nCell;  /* Size
2b170 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65   of the pCell ce
2b180 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ll in bytes */. 
2b190 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2b1a0 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2b1b0 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20  Page, idx);..   
2b1c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
2b1d0 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
2b1e0 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
2b1f0 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
2b200 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
2b210 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
2b220 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
2b230 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
2b240 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
2b250 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2b260 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
2b270 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
2b280 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
2b290 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
2b2a0 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
2b2b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
2b2c0 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
2b2d0 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
2b2e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
2b2f0 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
2b300 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
2b310 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
2b320 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
2b330 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
2b340 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
2b350 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
2b360 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
2b370 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
2b380 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
2b390 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
2b3a0 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
2b3b0 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
2b3c0 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
2b3d0 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
2b3e0 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
2b3f0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2b400 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
2b410 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
2b420 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
2b430 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
2b440 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
2b450 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
2b460 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
2b470 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
2b480 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
2b490 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2b4a0 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
2b4b0 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e  nCell+1==pPage->
2b4c0 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
2b4d0 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2b4e0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2b4f0 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d  (void*)&pCell[1]
2b500 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2b510 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
2b520 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29  pCell[1] & 0x80)
2b530 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
2b540 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26  nCell = ((nCell&
2b550 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c  0x7f)<<7) + pCel
2b560 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61  l[1])<=pPage->ma
2b570 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29  xLocal.        )
2b580 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2b590 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
2b5a0 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
2b5b0 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
2b5c0 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
2b5d0 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
2b5e0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
2b5f0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2b600 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2b610 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2b620 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
2b630 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2b640 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2b650 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2b660 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
2b670 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2b680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2b690 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
2b6a0 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
2b6b0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
2b6c0 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
2b6d0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
2b6e0 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
2b6f0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
2b700 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
2b710 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
2b720 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
2b730 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
2b740 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
2b750 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
2b760 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
2b770 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
2b780 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
2b790 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20  n be called. .  
2b7a0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2b7b0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72       ** If the r
2b7c0 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74  ecord is corrupt
2b7d0 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d  , the xRecordCom
2b7e0 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79  pare routine may
2b7f0 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20   read.          
2b800 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72  ** up to two var
2b810 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e  ints past the en
2b820 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e  d of the buffer.
2b830 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20   An extra 18 .  
2b840 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
2b850 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61   of padding is a
2b860 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20  llocated at the 
2b870 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2b880 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  r in.          *
2b890 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70  * case this happ
2b8a0 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ens.  */.       
2b8b0 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
2b8c0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
2b8d0 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
2b8e0 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
2b8f0 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
2b900 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2b910 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
2b920 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
2b930 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
2b940 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
2b950 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
2b960 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Key;.          t
2b970 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30  estcase( nCell<0
2b980 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66   );   /* True if
2b990 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33   key size is 2^3
2b9a0 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20  2 or more */.   
2b9b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2b9c0 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a   nCell==0 );  /*
2b9d0 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2b9e0 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2b9f0 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  00 */.          
2ba00 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2ba10 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69  =1 );  /* Invali
2ba20 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38  d key size:  0x8
2ba30 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20  0 0x80 0x01 */. 
2ba40 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2ba50 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20  e( nCell==2 );  
2ba60 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c  /* Minimum legal
2ba70 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20   index key size 
2ba80 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2ba90 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20   nCell<2 ){.    
2baa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2bab0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2bac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2bad0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2bae0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2baf0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
2bb00 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2bb10 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20  ( nCell+18 );.  
2bb20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2bb30 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lKey==0 ){.     
2bb40 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2bb50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2bb60 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2bb70 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2bb80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bb90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2bba0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2bbb0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72  idx;.          r
2bbc0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
2bbd0 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
2bbe0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2bbf0 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a  *)pCellKey, 2);.
2bc00 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2bc10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2bc20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2bc30 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2bc40 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2bc50 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2bc60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
2bc70 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2bc80 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79  (nCell, pCellKey
2bc90 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2bca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2bcb0 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
2bcc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2bcd0 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20  assert( .       
2bce0 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65       (pIdxKey->e
2bcf0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43  rrCode!=SQLITE_C
2bd00 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a  ORRUPT || c==0).
2bd10 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64           && (pId
2bd20 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2bd30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70  QLITE_NOMEM || p
2bd40 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2bd50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20  >mallocFailed). 
2bd60 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2bd70 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
2bd80 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2bd90 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  +1;.        }els
2bda0 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20  e if( c>0 ){.   
2bdb0 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
2bdc0 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
2bdd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2bde0 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20  ert( c==0 );.   
2bdf0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2be00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2be10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2be20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2be30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2be40 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2be50 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79       if( pIdxKey
2be60 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d  ->errCode ) rc =
2be70 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
2be80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2be90 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2bea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2beb0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
2bec0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2bed0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2bee0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2bef0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2bf00 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2bf10 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
2bf20 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2bf30 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
2bf40 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
2bf50 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
2bf60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2bf70 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2bf80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2bf90 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
2bfa0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2bfb0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
2bfc0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2bfd0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
2bfe0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
2bff0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c000 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2c010 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
2c020 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c030 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
2c040 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c050 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74     }.moveto_next
2c060 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20  _layer:.    if( 
2c070 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
2c080 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
2c090 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
2c0a0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2c0b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2c0c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c0d0 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2c0e0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2c0f0 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
2c100 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2c110 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2c120 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63  (u16)lwr;.    rc
2c130 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2c140 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
2c150 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2c160 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
2c170 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ish:.  pCur->inf
2c180 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2c190 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2c1a0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2c1b0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2c1c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2c1d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
2c1e0 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
2c1f0 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
2c200 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2c210 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
2c220 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
2c230 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
2c240 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
2c250 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
2c260 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
2c270 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2c280 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
2c290 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
2c2a0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
2c2b0 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
2c2c0 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
2c2d0 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
2c2e0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
2c2f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
2c300 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2c310 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
2c320 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
2c330 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
2c340 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
2c350 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
2c360 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
2c370 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
2c380 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
2c390 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
2c3a0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
2c3b0 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
2c3c0 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
2c3d0 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
2c3e0 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
2c3f0 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
2c400 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
2c410 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
2c420 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
2c430 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
2c440 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
2c450 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
2c460 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
2c470 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
2c480 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
2c490 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2c4a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2c4b0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
2c4c0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
2c4d0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2c4e0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
2c4f0 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2c500 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c510 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  t().  That routi
2c520 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2c530 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2c540 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2c550 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
2c560 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2c570 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2c580 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c   to the next cel
2c590 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  l on the current
2c5a0 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f   page.  The (slo
2c5b0 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29  wer) btreeNext()
2c5c0 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69   helper.** routi
2c5d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2c5e0 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2c5f0 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2c600 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72  ifferent page or
2c610 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
2c620 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2c630 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2c640 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
2c650 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
2c660 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
2c670 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
2c680 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
2c690 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
2c6a0 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
2c6b0 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2c6c0 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
2c6d0 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
2c6e0 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
2c6f0 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
2c700 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
2c710 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
2c720 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
2c730 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
2c740 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
2c750 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
2c760 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
2c770 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2c780 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
2c790 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
2c7a0 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
2c7b0 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
2c7c0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
2c7d0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
2c7e0 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
2c7f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2c800 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
2c810 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
2c820 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
2c830 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
2c840 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
2c850 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  r.).*/.static SQ
2c860 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2c870 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75  t btreeNext(BtCu
2c880 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2c890 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2c8a0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
2c8b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
2c8c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2c8d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
2c8e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c8f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2c900 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2c910 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2c920 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2c930 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
2c940 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2c950 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61  R_VALID ){.    a
2c960 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2c970 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2c980 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2c990 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2c9a0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2c9b0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2c9c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c9d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c9e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2c9f0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2ca00 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2ca10 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2ca20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ca30 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2ca40 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2ca50 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
2ca60 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2ca70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
2ca80 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
2ca90 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
2caa0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
2cab0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2cac0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
2cad0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30  pCur->skipNext>0
2cae0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2caf0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2cb00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2cb10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2cb20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
2cb30 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2cb40 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
2cb50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2cb60 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
2cb70 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
2cb80 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
2cb90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2cba0 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a  >isInit );..  /*
2cbb0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2cbc0 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
2cbd0 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
2cbe0 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
2cbf0 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
2cc00 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
2cc10 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
2cc20 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
2cc30 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
2cc40 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
2cc50 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
2cc60 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
2cc70 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
2cc80 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
2cc90 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2cca0 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
2ccb0 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
2ccc0 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
2ccd0 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
2cce0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
2ccf0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
2cd00 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
2cd10 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
2cd20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70  );..  if( idx>=p
2cd30 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2cd40 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2cd50 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2cd60 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2cd70 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
2cd80 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2cd90 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
2cda0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2cdb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cdc0 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
2cdd0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2cde0 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
2cdf0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
2ce00 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
2ce10 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2ce20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2ce30 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2ce40 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
2ce50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2ce60 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2ce70 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2ce80 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
2ce90 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2cea0 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
2ceb0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
2cec0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
2ced0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
2cee0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2cef0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
2cf00 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  urn sqlite3Btree
2cf10 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29  Next(pCur, pRes)
2cf20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2cf30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cf40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2cf50 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2cf60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2cf70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2cf80 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2cf90 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2cfa0 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71  r);.  }.}.int sq
2cfb0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
2cfc0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2cfd0 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d  nt *pRes){.  Mem
2cfe0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61  Page *pPage;.  a
2cff0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2d000 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2d010 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2d020 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d030 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2d040 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2d050 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2d060 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2d070 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d080 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
2d090 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2d0a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2d0b0 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2d0c0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2d0d0 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2d0e0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2d0f0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2d100 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e   ) return btreeN
2d110 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2d120 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2d130 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d140 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70  age];.  if( (++p
2d150 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d160 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d  >iPage])>=pPage-
2d170 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43  >nCell ){.    pC
2d180 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d190 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65  iPage]--;.    re
2d1a0 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2d1b0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2d1c0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2d1d0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2d1e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2d1f0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2d200 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2d210 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
2d220 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
2d230 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
2d240 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
2d250 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2d260 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2d270 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2d280 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2d290 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2d2a0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2d2b0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
2d2c0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2d2d0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
2d2e0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
2d2f0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
2d300 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
2d310 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2d320 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2d330 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
2d340 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2d350 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2d360 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2d370 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
2d380 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2d390 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2d3a0 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2d3b0 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
2d3c0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2d3d0 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2d3e0 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
2d3f0 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
2d400 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2d410 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2d420 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2d430 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
2d440 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
2d450 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2d460 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2d470 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2d480 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2d490 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2d4a0 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2d4b0 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2d4c0 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2d4d0 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2d4e0 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2d4f0 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2d500 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2d510 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2d520 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2d530 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2d540 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2d550 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2d560 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2d570 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2d580 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2d590 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2d5a0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2d5b0 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2d5c0 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2d5d0 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2d5e0 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2d5f0 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2d600 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2d610 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2d620 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2d630 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2d640 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2d650 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2d660 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2d670 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2d680 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2d690 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2d6a0 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
2d6b0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2d6c0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2d6d0 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2d6e0 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2d6f0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2d700 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2d710 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20  assert( pRes!=0 
2d720 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
2d730 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es==0 );.  asser
2d740 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2d750 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2d760 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2d770 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2d780 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2d790 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42  & (BTCF_AtLast|B
2d7a0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2d7b0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d  CF_ValidNKey))==
2d7c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2d7d0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2d7e0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2d7f0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2d800 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63  _VALID ){.    rc
2d810 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
2d820 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
2d830 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2d850 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2d860 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2d870 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2d880 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  tate ){.      *p
2d890 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  Res = 1;.      r
2d8a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d8b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2d8c0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
2d8d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2d8e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2d8f0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
2d900 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d910 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
2d920 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2d930 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2d940 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2d950 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
2d960 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
2d970 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
2d980 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d990 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2d9a0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2d9b0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
2d9c0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2d9d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2d9e0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2d9f0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2da00 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2da10 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
2da20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
2da30 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
2da40 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2da50 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2da60 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2da70 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
2da80 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2da90 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  rc;.    rc = mov
2daa0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
2dab0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
2dac0 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
2dad0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2dae0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
2daf0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2db00 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2db10 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2db20 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2db30 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2db40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2db50 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2db60 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
2db70 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
2db80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2db90 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2dba0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
2dbb0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2dbc0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
2dbd0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29  BTCF_ValidOvfl))
2dbe0 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72  ==0 );..    pCur
2dbf0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2dc00 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
2dc10 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2dc20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2dc30 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
2dc40 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
2dc50 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2dc60 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
2dc70 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
2dc80 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
2dc90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2dca0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2dcb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
2dcc0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
2dcd0 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
2dce0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2dcf0 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  s){.  assert( cu
2dd00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2dd10 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2dd20 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2dd30 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2dd40 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2dd50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2dd60 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2dd70 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2dd80 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70  OR_VALID );.  *p
2dd90 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Res = 0;.  pCur-
2dda0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2ddb0 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f  TCF_AtLast|BTCF_
2ddc0 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56  ValidOvfl|BTCF_V
2ddd0 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75  alidNKey);.  pCu
2dde0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2ddf0 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  0;.  if( pCur->e
2de00 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2de10 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e  LID.   || pCur->
2de20 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2de30 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72  e]==0.   || pCur
2de40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2de50 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20  Page]->leaf==0. 
2de60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
2de70 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
2de80 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20  r, pRes);.  }.  
2de90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2dea0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65  ->iPage]--;.  re
2deb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2dec0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
2ded0 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
2dee0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
2def0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
2df00 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
2df10 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
2df20 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
2df30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2df40 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
2df50 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
2df60 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
2df70 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
2df80 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
2df90 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
2dfa0 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
2dfb0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2dfc0 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
2dfd0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2dfe0 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
2dff0 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
2e000 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
2e010 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
2e020 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
2e030 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
2e040 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
2e050 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
2e060 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
2e070 4c 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  LL in the event 
2e080 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  of an error..**.
2e090 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62  ** If the "nearb
2e0a0 79 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  y" parameter is 
2e0b0 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65  not 0, then an e
2e0c0 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
2e0d0 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
2e0e0 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
2e0f0 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
2e100 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
2e110 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
2e120 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
2e130 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
2e140 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
2e150 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
2e160 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
2e170 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
2e180 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
2e190 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
2e1a0 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61   If the eMode pa
2e1b0 72 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c  rameter is BTALL
2e1c0 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65  OC_EXACT and the
2e1d0 20 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69   nearby page exi
2e1e0 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  sts.** anywhere 
2e1f0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
2e200 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
2e210 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  ranteed to be re
2e220 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65  turned.  If.** e
2e230 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
2e240 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  LT then the page
2e250 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62   returned will b
2e260 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  e less than or e
2e270 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62  qual.** to nearb
2e280 79 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61  y if any such pa
2e290 67 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65  ge exists.  If e
2e2a0 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f  Mode is BTALLOC_
2e2b0 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a  ANY then there.*
2e2c0 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63  * are no restric
2e2d0 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70  tions on which p
2e2e0 61 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  age is returned.
2e2f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2e300 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2e310 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
2e320 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  t,         /* Th
2e330 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  e btree */.  Mem
2e340 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
2e350 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69      /* Store poi
2e360 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f  nter to the allo
2e370 63 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20  cated page here 
2e380 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
2e390 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
2e3a0 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75  tore the page nu
2e3b0 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50  mber here */.  P
2e3c0 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20  gno nearby,     
2e3d0 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
2e3e0 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20  for a page near 
2e3f0 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38  this one */.  u8
2e400 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20   eMode          
2e410 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f       /* BTALLOC_
2e420 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c  EXACT, BTALLOC_L
2e430 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e  T, or BTALLOC_AN
2e440 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  Y */.){.  MemPag
2e450 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
2e460 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20   rc;.  u32 n;   
2e470 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2e480 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2e490 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b  list */.  u32 k;
2e4a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e4b0 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
2e4c0 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
2e4d0 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
2e4e0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
2e4f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
2e500 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e  Trunk = 0;.  Pgn
2e510 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a  o mxPage;     /*
2e520 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
2e530 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e540 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2e550 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2e560 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2e570 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
2e580 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c  ==BTALLOC_ANY ||
2e590 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66   (nearby>0 && If
2e5a0 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61  NotOmitAV(pBt->a
2e5b0 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20  utoVacuum)) );. 
2e5c0 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
2e5d0 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20  Page1;.  mxPage 
2e5e0 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
2e5f0 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44  (pBt);.  /* EVID
2e600 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39  ENCE-OF: R-05119
2e610 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74  -02637 The 4-byt
2e620 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
2e630 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
2e640 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74  6.  ** stores st
2e650 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  ores the total n
2e660 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2e670 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
2e680 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  */.  n = get4byt
2e690 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2e6a0 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
2e6b0 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
2e6c0 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
2e6d0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2e6e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2e6f0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
2e700 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
2e710 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
2e720 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
2e730 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
2e740 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
2e750 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
2e760 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
2e770 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
2e780 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
2e790 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
2e7a0 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32  arby' */.    u32
2e7b0 20 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20   nSearch = 0;   
2e7c0 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20  /* Count of the 
2e7d0 6e 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68  number of search
2e7e0 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20   attempts */.   
2e7f0 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64   .    /* If eMod
2e800 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2e810 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20   and a query of 
2e820 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
2e830 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61      ** shows tha
2e840 74 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  t the page 'near
2e850 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65  by' is somewhere
2e860 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
2e870 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  t, then.    ** t
2e880 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77  he entire-list w
2e890 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20  ill be searched 
2e8a0 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20  for that page.. 
2e8b0 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
2e8c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2e8d0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f  CUUM.    if( eMo
2e8e0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2e8f0 54 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  T ){.      if( n
2e900 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
2e910 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70  .        u8 eTyp
2e920 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e;.        asser
2e930 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
2e940 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2e950 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2e960 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
2e970 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65  trmapGet(pBt, ne
2e980 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29  arby, &eType, 0)
2e990 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2e9a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e9b0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
2e9c0 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
2e9d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65   ){.          se
2e9e0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2e9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ea00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d      }else if( eM
2ea10 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
2ea20 29 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c  ){.      searchL
2ea30 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ist = 1;.    }.#
2ea40 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65  endif..    /* De
2ea50 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
2ea60 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31  -list count by 1
2ea70 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20  . Set iTrunk to 
2ea80 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
2ea90 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72  .    ** first fr
2eaa0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
2eab0 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69  ge. iPrevTrunk i
2eac0 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20  s initially 1.. 
2ead0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
2eae0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2eaf0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
2eb00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2eb10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
2eb20 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2eb30 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29  >aData[36], n-1)
2eb40 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
2eb50 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c  de within this l
2eb60 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20  oop is run only 
2eb70 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61  once if the 'sea
2eb80 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c  rchList' variabl
2eb90 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  e.    ** is not 
2eba0 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  true. Otherwise,
2ebb0 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f   it runs once fo
2ebc0 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67  r each trunk-pag
2ebd0 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e on the.    ** 
2ebe0 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20  free-list until 
2ebf0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
2ec00 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
2ec10 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41  ode==BTALLOC_EXA
2ec20 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e  CT).    ** or un
2ec30 74 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20  til a page less 
2ec40 74 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73  than 'nearby' is
2ec50 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
2ec60 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20  =BTALLOC_LT).   
2ec70 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
2ec80 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
2ec90 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
2eca0 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
2ecb0 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
2ecc0 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d  NCE-OF: R-01506-
2ecd0 31 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20  11053 The first 
2ece0 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65  integer on a fre
2ecf0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2ed00 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74  .        ** is t
2ed10 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2ed20 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c  f the next freel
2ed30 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  ist trunk page i
2ed40 6e 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20  n the list or.  
2ed50 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66        ** zero if
2ed60 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73   this is the las
2ed70 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  t freelist trunk
2ed80 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
2ed90 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
2eda0 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
2edb0 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
2edc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2edd0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
2ede0 20 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54   R-59841-13798 T
2edf0 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  he 4-byte big-en
2ee00 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20  dian integer at 
2ee10 6f 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20  offset 32.      
2ee20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
2ee30 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2ee40 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
2ee50 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f   the freelist, o
2ee60 72 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20  r zero if.      
2ee70 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
2ee80 74 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20  t is empty. */. 
2ee90 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
2eea0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2eeb0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
2eec0 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
2eed0 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78  case( iTrunk==mx
2eee0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Page );.      if
2eef0 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  ( iTrunk>mxPage 
2ef00 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e  || nSearch++ > n
2ef10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2ef20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2ef30 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BKPT;.      }els
2ef40 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
2ef50 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
2ef60 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
2ef70 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
2ef80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2ef90 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
2efa0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
2efb0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2efc0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
2efd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2efe0 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20  Trunk!=0 );.    
2eff0 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
2f000 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20  ->aData!=0 );.  
2f010 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
2f020 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39  OF: R-13523-0439
2f030 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74  4 The second int
2f040 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69  eger on a freeli
2f050 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20  st trunk page.  
2f060 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75      ** is the nu
2f070 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
2f080 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f  e pointers to fo
2f090 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b  llow. */.      k
2f0a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2f0b0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
2f0c0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26        if( k==0 &
2f0d0 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b  & !searchList ){
2f0e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2f0f0 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61  trunk has no lea
2f100 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74  ves and the list
2f110 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65   is not being se
2f120 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20  arched. .       
2f130 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74   ** So extract t
2f140 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74  he trunk page it
2f150 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20  self and use it 
2f160 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20  as the newly .  
2f170 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74        ** allocat
2f180 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
2f190 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76     assert( pPrev
2f1a0 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  Trunk==0 );.    
2f1b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f1c0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2f1d0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2f1e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2f1f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2f200 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2f210 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f220 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
2f230 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  nk;.        memc
2f240 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
2f250 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
2f260 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
2f270 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
2f280 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
2f290 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
2f2a0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2f2b0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
2f2c0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
2f2d0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
2f2e0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n-1));.      }el
2f2f0 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70  se if( k>(u32)(p
2f300 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
2f310 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20   - 2) ){.       
2f320 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69   /* Value of k i
2f330 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
2f340 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
2f350 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
2f360 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2f370 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2f380 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2f390 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65  ate_page;.#ifnde
2f3a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2f3b0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d  TOVACUUM.      }
2f3c0 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c  else if( searchL
2f3d0 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ist .           
2f3e0 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72   && (nearby==iTr
2f3f0 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e  unk || (iTrunk<n
2f400 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
2f410 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
2f420 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
2f430 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
2f440 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
2f450 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
2f460 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
2f470 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
2f480 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
2f490 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
2f4a0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
2f4b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50    */.        *pP
2f4c0 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
2f4d0 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
2f4e0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  pTrunk;.        
2f4f0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
2f500 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f510 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f520 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2f530 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2f540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2f550 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f560 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
2f570 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
2f580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2f590 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
2f5a0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2f5b0 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  py(&pPage1->aDat
2f5c0 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  a[32], &pTrunk->
2f5d0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
2f5e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2f5f0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2f600 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f610 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
2f620 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2f630 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f650 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2f660 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2f670 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2f680 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2f690 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2f6a0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
2f6b0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
2f6c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f6d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f6e0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
2f6f0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
2f700 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62   by the caller b
2f710 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a  ut it contains .
2f720 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
2f730 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69  nters to free-li
2f740 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66  st leaves. The f
2f750 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65  irst leaf become
2f760 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20  s a trunk.      
2f770 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74      ** page in t
2f780 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20  his case..      
2f790 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2f7a0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72   MemPage *pNewTr
2f7b0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50  unk;.          P
2f7c0 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20  gno iNewTrunk = 
2f7d0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
2f7e0 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
2f7f0 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54         if( iNewT
2f800 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a  runk>mxPage ){ .
2f810 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2f820 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2f830 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2f840 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2f850 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2f860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2f870 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72  testcase( iNewTr
2f880 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  unk==mxPage );. 
2f890 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
2f8a0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
2f8b0 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c  (pBt, iNewTrunk,
2f8c0 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b   &pNewTrunk, 0);
2f8d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2f8e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f8f0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2f900 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2f910 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
2f920 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2f930 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2f940 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50  (pNewTrunk->pDbP
2f950 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2f960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2f980 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2f990 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2f9a0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f9b0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f9c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f9d0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2f9e0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2f9f0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2fa00 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2fa10 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54   put4byte(&pNewT
2fa20 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
2fa30 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
2fa40 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
2fa50 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54  k->aData[8], &pT
2fa60 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c  runk->aData[12],
2fa70 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20   (k-1)*4);.     
2fa80 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2fa90 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
2faa0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
2fab0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
2fac0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
2fad0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2fae0 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44  eable(pPage1->pD
2faf0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20  bPage) );.      
2fb00 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2fb10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2fb20 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
2fb30 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2fb40 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2fb50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2fb60 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
2fb70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2fb80 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
2fba0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2fbb0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
2fbc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
2fbd0 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  ut4byte(&pPrevTr
2fbe0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69  unk->aData[0], i
2fbf0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
2fc00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2fc10 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2fc20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2fc30 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2fc40 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2fc50 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2fc60 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2fc70 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
2fc80 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20  se if( k>0 ){.  
2fc90 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
2fca0 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
2fcb0 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
2fcc0 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20    u32 closest;. 
2fcd0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
2fce0 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
2fcf0 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
2fd00 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
2fd10 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
2fd20 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
2fd30 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
2fd40 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2fd50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2fd60 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
2fd70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fd80 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
2fd90 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2fda0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
2fdb0 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
2fdc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2fdd0 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72   if( iPage<=near
2fde0 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  by ){.          
2fdf0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2fe00 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
2fe10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2fe20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fe30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fe40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2fe50 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20       int dist;. 
2fe60 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
2fe70 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
2fe80 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
2fe90 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
2fea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2feb0 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
2fec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2fed0 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41  nt d2 = sqlite3A
2fee0 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65  bsInt32(get4byte
2fef0 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20  (&aData[8+i*4]) 
2ff00 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
2ff10 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
2ff20 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dist ){.        
2ff30 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2ff40 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
2ff50 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
2ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2ff70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ff80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ff90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2ffa0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
2ffb0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2ffc0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2ffd0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
2ffe0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
2fff0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
30000 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
30010 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
30020 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
30030 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
30040 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
30050 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30060 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30080 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
30090 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
300a0 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
300b0 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ist .         ||
300c0 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20   (iPage==nearby 
300d0 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79  || (iPage<nearby
300e0 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   && eMode==BTALL
300f0 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20  OC_LE)) .       
30100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
30110 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20  t noContent;.   
30120 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
30130 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  iPage;.         
30140 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
30150 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
30160 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
30170 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
30180 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
30190 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
301a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301b0 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
301c0 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
301d0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
301e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
301f0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
30200 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
30210 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
30220 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63  ) goto end_alloc
30230 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30240 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c      if( closest<
30250 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  k-1 ){.         
30260 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
30270 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26  [8+closest*4], &
30280 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29  aData[4+k*4], 4)
30290 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
302a0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
302b0 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  (&aData[4], k-1)
302c0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
302d0 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
302e0 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
302f0 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f   *pPgno)? PAGER_
30300 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20  GET_NOCONTENT : 
30310 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
30320 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
30330 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
30340 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74  , ppPage, noCont
30350 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ent);.          
30360 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
30390 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
303a0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
303b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
303c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
303d0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
303e0 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
303f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30400 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
30410 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30430 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
30440 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30450 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
30460 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
30470 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
30480 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
30490 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
304a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
304b0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
304c0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
304d0 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
304e0 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
304f0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
30500 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
30510 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
30520 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
30530 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
30540 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
30550 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
30560 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
30570 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
30580 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
30590 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
305a0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
305b0 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
305c0 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
305d0 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
305e0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
305f0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
30600 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
30610 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
30620 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
30630 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
30640 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
30650 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
30660 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
30670 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
30680 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
30690 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
306a0 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
306b0 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
306c0 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
306d0 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
306e0 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
306f0 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
30700 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
30710 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
30720 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
30730 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
30740 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
30750 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
30760 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
30770 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
30780 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
30790 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
307a0 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
307b0 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
307c0 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
307d0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
307e0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
307f0 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
30800 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
30810 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
30820 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
30830 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
30840 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
30850 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
30860 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
30870 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
30880 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
30890 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
308a0 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
308b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
308c0 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
308d0 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
308e0 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
308f0 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45  cate))? PAGER_GE
30900 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a  T_NOCONTENT:0;..
30910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30920 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
30930 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
30940 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
30950 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42  eturn rc;.    pB
30960 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
30970 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
30980 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30990 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
309a0 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20  age++;..#ifndef 
309b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
309c0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
309d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
309e0 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
309f0 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  pBt, pBt->nPage)
30a00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
30a10 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
30a20 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
30a30 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
30a40 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
30a50 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
30a60 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
30a70 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
30a80 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
30a90 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
30aa0 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
30ab0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
30ac0 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
30ad0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
30ae0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
30af0 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
30b00 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
30b10 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
30b20 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
30b30 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
30b40 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29  n", pBt->nPage))
30b50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
30b60 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44  pBt->nPage!=PEND
30b70 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
30b80 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
30b90 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
30ba0 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  age(pBt, pBt->nP
30bb0 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f  age, &pPg, bNoCo
30bc0 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66  ntent);.      if
30bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
30be0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
30bf0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30c00 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
30c10 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
30c20 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
30c30 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
30c40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
30c50 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
30c60 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
30c70 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
30c80 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
30c90 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
30ca0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
30cb0 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
30cc0 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
30cd0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
30ce0 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
30cf0 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
30d00 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
30d10 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
30d20 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
30d30 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
30d40 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
30d50 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62  pPgno, ppPage, b
30d60 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
30d70 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
30d80 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
30d90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28  ite3PagerWrite((
30da0 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
30db0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
30dc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30dd0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
30de0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
30df0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
30e00 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
30e10 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
30e20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
30e30 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
30e40 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
30e50 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
30e60 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
30e70 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
30e80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
30e90 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
30ea0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
30eb0 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
30ec0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
30ed0 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
30ee0 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
30ef0 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20  pDbPage)<=1 );. 
30f00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
30f10 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61  ITE_OK || (*ppPa
30f20 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
30f30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
30f40 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
30f50 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
30f60 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
30f70 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
30f80 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
30f90 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
30fa0 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
30fb0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
30fc0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
30fd0 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
30fe0 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
30ff0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
31000 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
31010 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
31020 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
31030 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
31040 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
31050 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
31060 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
31070 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
31080 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
31090 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
310a0 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
310b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
310c0 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
310d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
310e0 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
310f0 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
31100 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
31110 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
31120 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
31130 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
31140 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
31150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31160 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
31170 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
31180 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
31190 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
311a0 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
311b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
311c0 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
311d0 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
311e0 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
311f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31200 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
31210 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
31220 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
31230 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
31240 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
31250 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
31260 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
31270 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
31280 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
31290 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
312a0 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
312b0 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
312c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
312d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
312f0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
31300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
31320 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
31330 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
31340 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
31350 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
31360 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
31370 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
31380 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e  UPT_DB || iPage>
31390 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
313a0 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
313b0 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
313c0 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67  e );..  if( iPag
313d0 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e<2 ) return SQL
313e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
313f0 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ;.  if( pMemPage
31400 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
31410 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
31420 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
31430 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
31440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
31450 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
31460 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
31470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
31480 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
31490 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
314a0 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
314b0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
314c0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
314d0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
314e0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
314f0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
31500 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
31510 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
31520 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
31530 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
31540 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46  .  if( pBt->btsF
31550 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
31560 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
31570 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65  /* If the secure
31580 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69  _delete option i
31590 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
315a0 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75      ** always fu
315b0 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65  lly overwrite de
315c0 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
315d0 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
315e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70    */.    if( (!p
315f0 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62  Page && ((rc = b
31600 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
31610 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
31620 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c  0))!=0) ).     |
31630 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72  |            ((r
31640 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31650 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
31660 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29  Page))!=0).    )
31670 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
31680 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
31690 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67  .    memset(pPag
316a0 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61  e->aData, 0, pPa
316b0 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
316c0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  e);.  }..  /* If
316d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
316e0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
316f0 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74  um, write an ent
31700 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
31710 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e  r-map.  ** to in
31720 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
31730 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20  page is free..  
31740 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
31750 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72  ACUUM ){.    ptr
31760 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
31770 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
31780 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20  GE, 0, &rc);.   
31790 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66   if( rc ) goto f
317a0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
317b0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70  ..  /* Now manip
317c0 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c  ulate the actual
317d0 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
317e0 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54  ist structure. T
317f0 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a  here are two.  *
31800 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e  * possibilities.
31810 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
31820 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65  t is currently e
31830 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20  mpty, or if the 
31840 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b  first.  ** trunk
31850 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
31860 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20  e-list is full, 
31870 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77  then this page w
31880 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a  ill become a.  *
31890 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  * new free-list 
318a0 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65  trunk page. Othe
318b0 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62  rwise, it will b
318c0 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20  ecome a leaf of 
318d0 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  the.  ** first t
318e0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
318f0 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69   current free-li
31900 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74  st. This block t
31910 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20  ests if it.  ** 
31920 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  is possible to a
31930 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61  dd the page as a
31940 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c   new free-list l
31950 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  eaf..  */.  if( 
31960 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20  nFree!=0 ){.    
31970 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20  u32 nLeaf;      
31980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
31990 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  tial number of l
319a0 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75  eaf cells on tru
319b0 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20  nk page */..    
319c0 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
319d0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
319e0 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  [32]);.    rc = 
319f0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
31a00 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e  , iTrunk, &pTrun
31a10 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  k, 0);.    if( r
31a20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31a30 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
31a40 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  age_out;.    }..
31a50 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34      nLeaf = get4
31a60 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
31a70 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73  ata[4]);.    ass
31a80 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
31a90 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69  Size>32 );.    i
31aa0 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29  f( nLeaf > (u32)
31ab0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
31ac0 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72  4 - 2 ){.      r
31ad0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
31ae0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
31af0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
31b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31b10 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74  nLeaf < (u32)pBt
31b20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
31b30 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
31b40 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
31b50 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
31b60 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
31b70 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
31b80 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
31b90 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
31ba0 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
31bb0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
31bc0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
31bd0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
31be0 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
31bf0 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
31c00 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
31c10 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
31c20 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
31c30 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
31c40 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
31c50 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
31c60 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
31c70 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
31c80 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
31c90 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
31ca0 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
31cb0 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
31cc0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
31cd0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
31ce0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
31cf0 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
31d00 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
31d10 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
31d20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
31d30 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
31d40 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
31d50 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
31d60 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
31d70 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
31d80 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d  restrict the num
31d90 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74  ber of entries t
31da0 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  o usableSize/4 -
31db0 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20   8.      ** for 
31dc0 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f  now.  At some po
31dd0 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
31de0 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65  e (once everyone
31df0 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20   has upgraded.  
31e00 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20      ** to 3.6.0 
31e10 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f  or later) we sho
31e20 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78  uld consider fix
31e30 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  ing the conditio
31e40 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20  nal above.      
31e50 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62  ** to read "usab
31e60 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74  leSize/4-2" inst
31e70 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69  ead of "usableSi
31e80 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a  ze/4-8"..      *
31e90 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  *.      ** EVIDE
31ea0 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d  NCE-OF: R-19920-
31eb0 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e  11576 However, n
31ec0 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
31ed0 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20   SQLite still.  
31ee0 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69      ** avoid usi
31ef0 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20  ng the last six 
31f00 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66  entries in the f
31f10 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
31f20 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20  ge array in.    
31f30 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20    ** order that 
31f40 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63  database files c
31f50 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20  reated by newer 
31f60 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
31f70 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20  te can be.      
31f80 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72  ** read by older
31f90 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
31fa0 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ite..      */.  
31fb0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31fc0 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
31fd0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
31fe0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31ff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32000 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  put4byte(&pTrunk
32010 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61  ->aData[4], nLea
32020 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  f+1);.        pu
32030 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
32040 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d  aData[8+nLeaf*4]
32050 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
32060 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28    if( pPage && (
32070 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
32080 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
32090 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)==0 ){.       
320a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
320b0 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e  ontWrite(pPage->
320c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
320d0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
320e0 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74   btreeSetHasCont
320f0 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b  ent(pBt, iPage);
32100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54  .      }.      T
32110 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
32120 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75  : %d leaf on tru
32130 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50  nk page %d\n",pP
32140 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b  age->pgno,pTrunk
32150 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
32160 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
32170 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
32180 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c  /* If control fl
32190 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ows to this poin
321a0 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e  t, then it was n
321b0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61  ot possible to a
321c0 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20  dd the.  ** the 
321d0 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
321e0 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20   as a leaf page 
321f0 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75  of the first tru
32200 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
32210 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62  ist..  ** Possib
32220 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ly because the f
32230 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74  ree-list is empt
32240 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62  y, or possibly b
32250 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  ecause the .  **
32260 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
32270 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
32280 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61   full. Either wa
32290 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  y, the page bein
322a0 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c  g freed.  ** wil
322b0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
322c0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
322d0 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
322e0 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
322f0 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54  Page==0 && SQLIT
32300 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65  E_OK!=(rc = btre
32310 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
32320 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
32330 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
32340 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
32350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32360 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
32370 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
32380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
32390 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
323a0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
323b0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
323c0 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
323d0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
323e0 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
323f0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
32400 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
32410 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
32420 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
32430 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
32440 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
32450 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
32460 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
32470 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
32480 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
32490 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
324a0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
324b0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
324c0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
324d0 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
324e0 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65  void freePage(Me
324f0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
32500 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28  t *pRC){.  if( (
32510 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  *pRC)==SQLITE_OK
32520 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66   ){.    *pRC = f
32530 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e  reePage2(pPage->
32540 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67  pBt, pPage, pPag
32550 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a  e->pgno);.  }.}.
32560 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20  ./*.** Free any 
32570 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
32580 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
32590 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20  he given Cell.  
325a0 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  Write the.** loc
325b0 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68  al Cell size (th
325c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
325d0 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  s on the origina
325e0 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67  l page, omitting
325f0 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e  .** overflow) in
32600 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73  to *pnSize..*/.s
32610 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
32620 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
32630 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
32640 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
32650 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65   contains the Ce
32660 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
32670 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
32680 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
32690 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  f the Cell */.  
326a0 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  u16 *pnSize     
326b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
326c0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
326d0 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29  e Cell here */.)
326e0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
326f0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
32700 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
32710 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
32720 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
32730 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f  t nOvfl;.  u32 o
32740 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
32750 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
32760 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
32770 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
32780 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
32790 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
327a0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e  l, &info);.  *pn
327b0 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
327c0 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  e;.  if( info.iO
327d0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
327e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
327f0 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
32800 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
32810 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
32820 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
32830 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f    if( pCell+info
32840 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70  .iOverflow+3 > p
32850 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67  Page->aData+pPag
32860 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20  e->maskPage ){. 
32870 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32880 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20  _CORRUPT_BKPT;  
32890 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20  /* Cell extends 
328a0 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65  past end of page
328b0 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
328c0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
328d0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
328e0 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  low]);.  assert(
328f0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
32900 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
32910 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
32920 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
32930 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
32940 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
32950 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
32960 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
32970 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
32980 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20   nOvfl>0 || .   
32990 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20   (CORRUPT_DB && 
329a0 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2b  (info.nPayload +
329b0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f   ovflPageSize)<o
329c0 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29  vflPageSize).  )
329d0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
329e0 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
329f0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
32a00 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
32a10 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
32a20 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
32a30 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
32a40 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
32a50 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
32a60 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
32a70 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
32a80 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
32a90 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
32aa0 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
32ab0 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
32ac0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
32ad0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
32ae0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
32af0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
32b00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32b10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
32b20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
32b30 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
32b40 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
32b50 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
32b60 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
32b70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
32b80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
32b90 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
32ba0 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
32bb0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
32bc0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
32bd0 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
32be0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
32bf0 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
32c00 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
32c10 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
32c20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
32c30 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
32c40 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
32c50 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
32c60 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
32c70 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
32c80 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
32c90 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
32ca0 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
32cb0 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
32cc0 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
32cd0 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
32ce0 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
32cf0 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
32d00 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
32d10 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
32d20 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
32d30 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
32d40 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
32d50 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
32d60 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
32d70 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
32d80 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
32d90 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
32da0 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
32db0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
32dc0 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
32dd0 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
32de0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
32df0 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
32e00 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
32e10 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
32e20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
32e30 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
32e40 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
32e50 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
32e60 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
32e70 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
32e80 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
32e90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
32ea0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
32eb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
32ec0 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
32ed0 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
32ee0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
32ef0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
32f00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
32f10 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
32f20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
32f30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
32f40 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
32f50 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
32f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
32f70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
32f80 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
32f90 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
32fa0 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
32fb0 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
32fc0 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
32fd0 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
32fe0 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
32ff0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
33000 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
33010 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
33020 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
33030 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
33040 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
33050 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
33060 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
33070 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
33080 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
33090 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
330a0 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
330b0 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
330c0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
330d0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
330e0 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
330f0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
33100 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
33110 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
33120 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
33130 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
33140 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
33150 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
33160 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
33170 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
33180 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
33190 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
331a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
331b0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
331c0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
331d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
331e0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
331f0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
33200 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
33210 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
33220 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
33230 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
33240 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
33250 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
33260 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
33270 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
33280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33290 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
332a0 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
332b0 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
332c0 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
332d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332e0 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
332f0 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
33300 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
33310 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
33320 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
33330 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
33340 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
33350 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
33360 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
33370 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
33380 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
33390 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
333a0 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
333b0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
333c0 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
333d0 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
333e0 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73  t nHeader;..  as
333f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
33400 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
33410 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
33420 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
33430 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
33440 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
33450 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
33460 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
33470 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
33480 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
33490 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
334a0 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
334b0 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
334c0 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
334d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
334e0 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
334f0 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
33500 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
33510 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
33520 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
33530 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
33540 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70  */.  nHeader = p
33550 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
33560 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
33570 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
33580 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
33590 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e  KeyLeaf ){.    n
335a0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
335b0 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
335c0 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
335d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
335e0 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20  ssert( nData==0 
335f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
33600 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  Zero==0 );.  }. 
33610 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
33620 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
33630 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
33640 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  Key);.  .  /* Fi
33650 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
33660 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20  d size */.  if( 
33670 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
33680 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
33690 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
336a0 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
336b0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
336c0 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c 3d    assert( nKey<=
336d0 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70 4b  0x7fffffff && pK
336e0 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50 61  ey!=0 );.    nPa
336f0 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b 65  yload = (int)nKe
33700 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b  y;.    pSrc = pK
33710 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28  ey;.    nSrc = (
33720 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  int)nKey;.  }.  
33730 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
33740 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
33750 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72  .    n = nHeader
33760 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   + nPayload;.   
33770 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20   testcase( n==3 
33780 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
33790 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28   n==4 );.    if(
337a0 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20   n<4 ) n = 4;.  
337b0 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20    *pnSize = n;. 
337c0 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e     spaceLeft = n
337d0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50 72  Payload;.    pPr
337e0 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d  ior = pCell;.  }
337f0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 6e  else{.    int mn
33800 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
33810 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20 2b  al;.    n = mn +
33820 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29   (nPayload - mn)
33830 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e   % (pPage->pBt->
33840 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b  usableSize - 4);
33850 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
33860 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
33870 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
33880 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
33890 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
338a0 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
338b0 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
338c0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d  .    spaceLeft =
338d0 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20   n;.    *pnSize 
338e0 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20  = n + nHeader + 
338f0 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  4;.    pPrior = 
33900 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e  &pCell[nHeader+n
33910 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f 61  ];.  }.  pPayloa
33920 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
33930 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  er];..  /* At th
33940 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c  is point variabl
33950 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  es should be set
33960 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
33970 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61  *.  **   nPayloa
33980 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61  d           Tota
33990 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69  l payload size i
339a0 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70  n bytes.  **   p
339b0 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
339c0 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20    Begin writing 
339d0 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a  payload here.  *
339e0 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20  *   spaceLeft   
339f0 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61         Space ava
33a00 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f  ilable at pPaylo
33a10 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64  ad.  If nPayload
33a20 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a  >spaceLeft,.  **
33a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a40 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73        that means
33a50 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70   content must sp
33a60 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill into overflo
33a70 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20  w pages..  **   
33a80 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
33a90 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c     Size of the l
33aa0 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63  ocal cell (not c
33ab0 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77  ounting overflow
33ac0 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70   pages).  **   p
33ad0 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
33ae0 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65    Where to write
33af0 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65   the pgno of the
33b00 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
33b10 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  page.  **.  ** U
33b20 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72  se a call to btr
33b30 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
33b40 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
33b50 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65  the values above
33b60 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75  .  ** were compu
33b70 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
33b80 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44   */.#if SQLITE_D
33b90 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
33ba0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
33bb0 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
33bc0 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
33bd0 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
33be0 72 74 28 20 6e 48 65 61 64 65 72 3d 28 69 6e 74  rt( nHeader=(int
33bf0 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  )(info.pPayload 
33c00 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  - pCell) );.    
33c10 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
33c20 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61  y==nKey );.    a
33c30 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d  ssert( *pnSize =
33c40 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a  = info.nSize );.
33c50 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61 63      assert( spac
33c60 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c  eLeft == info.nL
33c70 6f 63 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  ocal );.    asse
33c80 72 74 28 20 70 50 72 69 6f 72 20 3d 3d 20 26 70  rt( pPrior == &p
33c90 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
33ca0 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  low] );.  }.#end
33cb0 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  if..  /* Write t
33cc0 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20  he payload into 
33cd0 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61  the local Cell a
33ce0 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e 74  nd any extra int
33cf0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
33d00 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e 50 61   */.  while( nPa
33d10 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
33d20 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
33d30 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
33d40 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
33d50 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
33d60 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
33d70 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
33d80 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
33d90 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
33da0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
33db0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
33dc0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
33dd0 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
33de0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
33df0 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
33e00 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
33e10 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
33e20 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
33e30 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
33e40 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
33e50 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
33e60 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
33e70 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
33e80 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
33e90 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
33ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33eb0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
33ec0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
33ed0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
33ee0 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
33ef0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
33f00 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
33f10 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
33f20 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
33f30 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
33f40 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
33f50 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
33f60 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
33f70 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
33f80 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
33f90 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
33fa0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
33fb0 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
33fc0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
33fd0 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
33fe0 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
33ff0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
34000 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
34010 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
34020 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
34030 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
34040 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
34050 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
34060 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
34070 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
34080 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
34090 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
340a0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
340b0 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
340c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
340d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
340e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
340f0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
34100 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
34110 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
34120 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
34130 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
34140 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
34150 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
34160 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
34170 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
34180 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
34190 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
341a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
341b0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
341c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
341d0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
341e0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
341f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
34200 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
34210 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
34220 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
34230 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
34240 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
34250 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
34260 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
34270 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
34280 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
34290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
342a0 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
342b0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
342c0 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
342d0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
342e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
342f0 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
34300 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
34310 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
34320 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
34330 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
34340 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
34350 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
34360 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
34370 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
34380 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
34390 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
343a0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
343b0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
343c0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
343d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
343e0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
343f0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
34400 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34410 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
34420 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
34430 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
34440 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
34450 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
34460 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
34470 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
34480 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
34490 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
344a0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
344b0 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
344c0 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
344d0 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
344e0 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
344f0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
34500 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
34510 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
34520 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
34530 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
34540 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
34550 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
34560 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
34570 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
34580 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
34590 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
345a0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
345b0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
345c0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
345d0 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
345e0 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
345f0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
34600 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
34610 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
34620 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
34630 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
34640 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
34650 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
34660 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
34670 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
34680 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
34690 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
346a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
346b0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
346c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
346d0 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
346e0 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
346f0 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
34700 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
34710 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
34720 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
34730 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
34740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
34750 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
34760 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
34770 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
34780 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
34790 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
347a0 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
347b0 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
347c0 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
347d0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
347e0 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
347f0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
34810 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
34820 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
34830 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
34840 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
34850 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
34860 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
34870 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
34880 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
34890 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
348a0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
348b0 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
348c0 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
348d0 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
348e0 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
348f0 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
34900 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
34910 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
34920 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
34930 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
34940 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
34950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
34960 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
34970 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
34980 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a  x, int sz, int *
34990 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20  pRC){.  u32 pc; 
349a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
349b0 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
349c0 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
349d0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
349e0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
349f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
34a00 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
34a10 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
34a20 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
34a30 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
34a40 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
34a50 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
34a60 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64  code */.  int hd
34a70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67  r;        /* Beg
34a80 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65  inning of the he
34a90 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61  ader.  0 most pa
34aa0 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31  ges.  100 page 1
34ab0 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
34ac0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
34ad0 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
34ae0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
34af0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
34b00 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63  RUPT_DB || sz==c
34b10 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
34b20 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
34b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34b40 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
34b50 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
34b60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
34b70 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
34b80 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
34b90 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
34ba0 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
34bb0 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
34bc0 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
34bd0 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
34be0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
34bf0 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
34c00 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
34c10 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
34c20 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
34c30 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
34c40 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
34c50 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67 65  if( pc < (u32)ge
34c60 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
34c70 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20  +5]) || pc+sz > 
34c80 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
34c90 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
34ca0 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
34cb0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
34cc0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
34cd0 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
34ce0 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
34cf0 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
34d00 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
34d10 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
34d20 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50  Cell--;.  if( pP
34d30 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
34d40 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
34d50 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
34d60 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
34d70 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79   = 0;.    put2by
34d80 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
34d90 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
34da0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  bleSize);.    pP
34db0 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
34dc0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
34dd0 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72  ize - pPage->hdr
34de0 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20  Offset.         
34df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
34e00 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
34e10 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65  ize - 8;.  }else
34e20 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74  {.    memmove(pt
34e30 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
34e40 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
34e50 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
34e60 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
34e70 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
34e80 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
34e90 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   2;.  }.}../*.**
34ea0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
34eb0 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
34ec0 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
34ed0 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
34ee0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
34ef0 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
34f00 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
34f10 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
34f20 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
34f30 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
34f40 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
34f50 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
34f60 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
34f70 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
34f80 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
34f90 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
34fa0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
34fb0 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
34fc0 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
34fd0 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
34fe0 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
34ff0 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
35000 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
35010 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
35020 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
35030 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
35040 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
35050 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
35060 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
35070 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
35080 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
35090 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
350a0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73  ncremented..*/.s
350b0 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
350c0 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
350d0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
350e0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
350f0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
35100 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
35110 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
35120 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
35130 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
35140 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
35150 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
35160 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
35170 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
35180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
35190 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
351a0 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
351b0 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
351c0 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
351d0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
351e0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
351f0 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
35200 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
35210 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
35220 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
35230 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
35240 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
35250 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
35260 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
35270 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
35280 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
35290 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
352a0 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
352b0 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
352c0 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
352d0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
352e0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ter */.  u8 *dat
352f0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
35300 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
35310 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
35320 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20   u8 *pIns;      
35330 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20     /* The point 
35340 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  in pPage->aCellI
35350 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65  dx[] where no ce
35360 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a  ll inserted */..
35370 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
35380 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
35390 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65  i>=0 && i<=pPage
353a0 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e  ->nCell+pPage->n
353b0 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73  Overflow );.  as
353c0 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50  sert( MX_CELL(pP
353d0 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
353e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
353f0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
35400 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
35410 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
35420 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35430 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72  ->nOverflow<=Arr
35440 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
35450 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
35460 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61  t( ArraySize(pPa
35470 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72  ge->apOvfl)==Arr
35480 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69  aySize(pPage->ai
35490 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
354a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
354b0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
354c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
354d0 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64   The cell should
354e0 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a   normally be siz
354f0 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48  ed correctly.  H
35500 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76  owever, when mov
35510 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f  ing a.  ** malfo
35520 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61  rmed cell from a
35530 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e   leaf page to an
35540 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20   interior page, 
35550 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  if the cell size
35560 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20  .  ** wanted to 
35570 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  be less than 4 b
35580 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75  ut got rounded u
35590 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65  p to 4 on the le
355a0 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20  af, then size.  
355b0 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73  ** might be less
355c0 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69   than 8 (leaf-si
355d0 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e  ze + pointer) on
355e0 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f   the interior no
355f0 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20  de.  Hence.  ** 
35600 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74  the term after t
35610 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c  he || in the fol
35620 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
35630 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a   */.  assert( sz
35640 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  ==pPage->xCellSi
35650 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ze(pPage, pCell)
35660 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43   || (sz==8 && iC
35670 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28  hild>0) );.  if(
35680 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
35690 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d  w || sz+2>pPage-
356a0 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66  >nFree ){.    if
356b0 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20  ( pTemp ){.     
356c0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 70   memcpy(pTemp, p
356d0 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20  Cell, sz);.     
356e0 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
356f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
35700 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
35710 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43  t4byte(pCell, iC
35720 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
35730 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65   j = pPage->nOve
35740 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73  rflow++;.    ass
35750 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a  ert( j<(int)(siz
35760 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
35770 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  l)/sizeof(pPage-
35780 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a  >apOvfl[0])) );.
35790 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66      pPage->apOvf
357a0 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  l[j] = pCell;.  
357b0 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b    pPage->aiOvfl[
357c0 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a 20 20  j] = (u16)i;..  
357d0 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70    /* When multip
357e0 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f 63 63  le overflows occ
357f0 75 72 2c 20 74 68 65 79 20 61 72 65 20 61 6c 77  ur, they are alw
35800 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c 20 61  ays sequential a
35810 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73 6f 72  nd in.    ** sor
35820 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68 69 73  ted order.  This
35830 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72 69 73   invariants aris
35840 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74 69 70  e because multip
35850 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63 61 6e  le overflows can
35860 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63  .    ** only occ
35870 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e  ur when insertin
35880 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  g divider cells 
35890 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
358a0 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20 20 20  page during.    
358b0 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20 61 6e  ** balancing, an
358c0 64 20 74 68 65 20 64 69 76 69 64 65 72 73 20 61  d the dividers a
358d0 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e 64 20  re adjacent and 
358e0 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  sorted..    */. 
358f0 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30 20     assert( j==0 
35900 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  || pPage->aiOvfl
35910 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29 3b 20  [j-1]<(u16)i ); 
35920 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69 6e 20  /* Overflows in 
35930 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a  sorted order */.
35940 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 30      assert( j==0
35950 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e 61 69   || i==pPage->ai
35960 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20  Ovfl[j-1]+1 );  
35970 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 61 72   /* Overflows ar
35980 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a 2f 0a  e sequential */.
35990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
359a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
359b0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
359c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
359d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
359e0 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
359f0 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
35a00 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
35a10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
35a20 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
35a30 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
35a40 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
35a50 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  aData;.    asser
35a60 74 28 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e  t( &data[pPage->
35a70 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70 50 61  cellOffset]==pPa
35a80 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29 3b 0a  ge->aCellIdx );.
35a90 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
35aa0 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
35ab0 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28  , &idx);.    if(
35ac0 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63   rc ){ *pRC = rc
35ad0 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20  ; return; }.    
35ae0 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53  /* The allocateS
35af0 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67  pace() routine g
35b00 75 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f  uarantees the fo
35b10 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69  llowing properti
35b20 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20  es.    ** if it 
35b30 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66  returns successf
35b40 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73 73 65  ully */.    asse
35b50 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29 3b 0a  rt( idx >= 0 );.
35b60 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 20      assert( idx 
35b70 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  >= pPage->cellOf
35b80 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43  fset+2*pPage->nC
35b90 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55 50 54  ell+2 || CORRUPT
35ba0 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _DB );.    asser
35bb0 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69 6e  t( idx+sz <= (in
35bc0 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
35bd0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
35be0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
35bf0 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
35c00 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
35c10 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29  idx], pCell, sz)
35c20 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
35c30 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
35c40 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
35c50 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
35c60 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65 2d 3e    pIns = pPage->
35c70 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32 3b 0a  aCellIdx + i*2;.
35c80 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49 6e 73      memmove(pIns
35c90 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70 50 61  +2, pIns, 2*(pPa
35ca0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29 29 3b  ge->nCell - i));
35cb0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 49  .    put2byte(pI
35cc0 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 50  ns, idx);.    pP
35cd0 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
35ce0 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74 20 74    /* increment t
35cf0 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20 2a 2f  he cell count */
35d00 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61 74 61  .    if( (++data
35d10 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
35d20 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74 61 5b  t+4])==0 ) data[
35d30 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
35d40 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  +3]++;.    asser
35d50 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74  t( get2byte(&dat
35d60 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
35d70 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d 3e 6e  et+3])==pPage->n
35d80 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65 66 20  Cell );.#ifndef 
35d90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
35da0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
35db0 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
35dc0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
35dd0 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
35de0 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
35df0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
35e00 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
35e10 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
35e20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
35e30 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
35e40 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
35e50 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
35e60 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
35e70 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
35e80 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pRC);.    }.#end
35e90 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
35ea0 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62 6a 65  A CellArray obje
35eb0 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 63 61  ct contains a ca
35ec0 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  che of pointers 
35ed0 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20 61 0a  and sizes for a.
35ee0 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65 20 73  ** consecutive s
35ef0 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c 6c 73  equence of cells
35f00 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 68   that might be h
35f10 65 6c 64 20 6d 75 6c 74 69 70 6c 65 20 70 61 67  eld multiple pag
35f20 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  es..*/.typedef s
35f30 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
35f40 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72 75 63  CellArray;.struc
35f50 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20  t CellArray {.  
35f60 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
35f70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35f80 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
35f90 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  Cell[] */.  MemP
35fa0 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20 20 20  age *pRef;      
35fb0 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
35fc0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
35fd0 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  apCell;         
35fe0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
35ff0 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
36000 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
36010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
36020 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
36030 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
36040 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  [] */.};../*.** 
36050 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 65  Make sure the ce
36060 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64 78 2c  ll sizes at idx,
36070 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78   idx+1, ..., idx
36080 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e 0a 2a  +N-1 have been.*
36090 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73  * computed..*/.s
360a0 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70 75 6c  tatic void popul
360b0 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43 65 6c  ateCellCache(Cel
360c0 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 69  lArray *p, int i
360d0 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73  dx, int N){.  as
360e0 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20  sert( idx>=0 && 
360f0 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20  idx+N<=p->nCell 
36100 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 30 20  );.  while( N>0 
36110 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
36120 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30  ->apCell[idx]!=0
36130 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   );.    if( p->s
36140 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b  zCell[idx]==0 ){
36150 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c  .      p->szCell
36160 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d  [idx] = p->pRef-
36170 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52  >xCellSize(p->pR
36180 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  ef, p->apCell[id
36190 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  x]);.    }else{.
361a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 43 4f        assert( CO
361b0 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20  RRUPT_DB ||.    
361c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 43            p->szC
361d0 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65  ell[idx]==p->pRe
361e0 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e  f->xCellSize(p->
361f0 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b  pRef, p->apCell[
36200 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20  idx]) );.    }. 
36210 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d     idx++;.    N-
36220 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  -;.  }.}../*.** 
36230 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
36240 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65 6d 65  of the Nth eleme
36250 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  nt of the cell a
36260 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53  rray.*/.static S
36270 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75  QLITE_NOINLINE u
36280 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  16 computeCellSi
36290 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c  ze(CellArray *p,
362a0 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
362b0 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e  t( N>=0 && N<p->
362c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
362d0 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d  t( p->szCell[N]=
362e0 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c  =0 );.  p->szCel
362f0 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e  l[N] = p->pRef->
36300 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
36310 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29  f, p->apCell[N])
36320 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a  ;.  return p->sz
36330 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69  Cell[N];.}.stati
36340 63 20 75 31 36 20 63 61 63 68 65 64 43 65 6c 6c  c u16 cachedCell
36350 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a  Size(CellArray *
36360 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
36370 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70  ert( N>=0 && N<p
36380 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
36390 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20   p->szCell[N] ) 
363a0 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c  return p->szCell
363b0 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f  [N];.  return co
363c0 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c  mputeCellSize(p,
363d0 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72   N);.}../*.** Ar
363e0 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e  ray apCell[] con
363f0 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74  tains pointers t
36400 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65 20 70  o nCell b-tree p
36410 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a  age cells. The .
36420 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61  ** szCell[] arra
36430 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  y contains the s
36440 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
36450 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  each cell. This 
36460 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c  function.** repl
36470 61 63 65 73 20 74 68 65 20 63 75 72 72 65 6e 74  aces the current
36480 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67   contents of pag
36490 65 20 70 50 67 20 77 69 74 68 20 74 68 65 20 63  e pPg with the c
364a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63  ontents of the c
364b0 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a  ell.** array..**
364c0 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68 65 20  .** Some of the 
364d0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
364e0 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c 79 20  ] may currently 
364f0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 67  be stored in pPg
36500 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
36510 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20  on works around 
36520 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
36530 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b 69 6e  by this by makin
36540 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e 79 20  g a copy of any 
36550 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73 20 62  .** such cells b
36560 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e  efore overwritin
36570 67 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e  g the page data.
36580 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61  .**.** The MemPa
36590 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  ge.nFree field i
365a0 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62 79  s invalidated by
365b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
365c0 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65  It is the .** re
365d0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
365e0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73 65  the caller to se
365f0 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a  t it correctly..
36600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
36610 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d  buildPage(.  Mem
36620 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
36630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36640 45 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a  Edit this page *
36650 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
36660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36670 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d      /* Final num
36680 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
36690 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
366a0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
366b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
366c0 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
366d0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
366e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366f0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
36700 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
36710 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
36720 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  pPg->hdrOffset; 
36730 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
36740 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20  et of header on 
36750 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  pPg */.  u8 * co
36760 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
36770 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  >aData;         
36780 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
36790 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a  data for pPg */.
367a0 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73 61 62    const int usab
367b0 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
367c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
367d0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64   u8 * const pEnd
367e0 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62 6c 65   = &aData[usable
367f0 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  Size];.  int i;.
36800 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d    u8 *pCellptr =
36810 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a   pPg->aCellIdx;.
36820 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c    u8 *pTmp = sql
36830 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
36840 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61  ce(pPg->pBt->pPa
36850 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44 61 74  ger);.  u8 *pDat
36860 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32 62 79  a;..  i = get2by
36870 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
36880 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 54 6d  );.  memcpy(&pTm
36890 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c  p[i], &aData[i],
368a0 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 69 29   usableSize - i)
368b0 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70 45 6e  ;..  pData = pEn
368c0 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  d;.  for(i=0; i<
368d0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
368e0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43   u8 *pCell = apC
368f0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ell[i];.    if( 
36900 70 43 65 6c 6c 3e 61 44 61 74 61 20 26 26 20 70  pCell>aData && p
36910 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20 20 20  Cell<pEnd ){.   
36920 20 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70     pCell = &pTmp
36930 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b  [pCell - aData];
36940 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61  .    }.    pData
36950 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20   -= szCell[i];. 
36960 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c     put2byte(pCel
36970 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61  lptr, (pData - a
36980 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c  Data));.    pCel
36990 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69  lptr += 2;.    i
369a0 66 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c  f( pData < pCell
369b0 70 74 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ptr ) return SQL
369c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
369d0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
369e0 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  ta, pCell, szCel
369f0 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[i]);.    asser
36a00 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50  t( szCell[i]==pP
36a10 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67  g->xCellSize(pPg
36a20 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  , pCell) || CORR
36a30 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65  UPT_DB );.    te
36a40 73 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69  stcase( szCell[i
36a50 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a  ]!=pPg->xCellSiz
36a60 65 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a  e(pPg,pCell) );.
36a70 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50    }..  /* The pP
36a80 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69  g->nFree field i
36a90 73 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72  s now set incorr
36aa0 65 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65  ectly. The calle
36ab0 72 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a  r will fix it. *
36ac0 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d  /.  pPg->nCell =
36ad0 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e   nCell;.  pPg->n
36ae0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
36af0 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61   put2byte(&aData
36b00 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70  [hdr+1], 0);.  p
36b10 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
36b20 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c  dr+3], pPg->nCel
36b30 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  l);.  put2byte(&
36b40 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44  aData[hdr+5], pD
36b50 61 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20  ata - aData);.  
36b60 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30  aData[hdr+7] = 0
36b70 78 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  x00;.  return SQ
36b80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
36b90 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
36ba0 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
36bb0 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
36bc0 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
36bd0 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69  szCell.** contai
36be0 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62  ns the size in b
36bf0 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63  ytes of each suc
36c00 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
36c10 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
36c20 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65  o .** add the ce
36c30 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  lls stored in th
36c40 65 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20  e array to page 
36c50 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f  pPg. If it canno
36c60 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74  t (because .** t
36c70 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
36c80 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64   be defragmented
36c90 20 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c   before the cell
36ca0 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e  s will fit), non
36cb0 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75  -zero.** is retu
36cc0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
36cd0 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72   if the cells ar
36ce0 65 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  e added successf
36cf0 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a  ully, zero is.**
36d00 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
36d10 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70   Argument pCellp
36d20 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  tr points to the
36d30 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
36d40 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
36d50 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20   array.** (part 
36d60 6f 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20  of page pPg) to 
36d70 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20  populate. After 
36d80 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69  cell apCell[0] i
36d90 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
36da0 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61  .** page body, a
36db0 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69   16-bit offset i
36dc0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65  s written to pCe
36dd0 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e  llptr. And so on
36de0 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65  , for each.** ce
36df0 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  ll in the array.
36e00 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
36e10 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
36e20 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72   caller to ensur
36e30 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20  e.** that it is 
36e40 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74  safe to overwrit
36e50 65 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74  e this part of t
36e60 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
36e70 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  array..**.** Whe
36e80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
36e90 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61  is called, *ppDa
36ea0 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ta points to the
36eb0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a   start of the .*
36ec0 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f  * content area o
36ed0 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74  n page pPg. If t
36ee0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63  he size of the c
36ef0 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65  ontent area is e
36f00 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44  xtended,.** *ppD
36f10 61 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74  ata is updated t
36f20 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
36f30 65 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ew start of the 
36f40 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20  content area.** 
36f50 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
36f60 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  ..**.** Finally,
36f70 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e   argument pBegin
36f80 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62   points to the b
36f90 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  yte immediately 
36fa0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a  following the.**
36fb0 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63   end of the spac
36fc0 65 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  e required by th
36fd0 69 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20  is page for the 
36fe0 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65  cell-pointer are
36ff0 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65  a (for.** all ce
37000 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74  lls - not just t
37010 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79  hose inserted by
37020 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c   the current cal
37030 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65  l). If the conte
37040 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20  nt.** area must 
37050 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62  be extended to b
37060 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74  efore this point
37070 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63   in order to acc
37080 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63  omodate all.** c
37090 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
370a0 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73  , then the cells
370b0 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20   do not fit and 
370c0 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
370d0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
370e0 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72  int pageInsertAr
370f0 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
37100 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
37110 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
37120 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a  o add cells to *
37130 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20  /.  u8 *pBegin, 
37140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37150 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65      /* End of ce
37160 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
37170 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74   */.  u8 **ppDat
37180 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a,              
37190 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
371a0 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61   Page content -a
371b0 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  rea pointer */. 
371c0 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20   u8 *pCellptr,  
371d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
371f0 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
37200 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
37210 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37220 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
37230 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  f first cell to 
37240 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  add */.  int nCe
37250 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
37260 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37270 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
37280 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43  dd to pPg */.  C
37290 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61  ellArray *pCArra
372a0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y              /
372b0 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
372c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
372d0 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50    u8 *aData = pP
372e0 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
372f0 70 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b  pData = *ppData;
37300 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46  .  int iEnd = iF
37310 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20  irst + nCell;.  
37320 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
37330 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66  DB || pPg->hdrOf
37340 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  fset==0 );    /*
37350 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e   Never called on
37360 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72   page 1 */.  for
37370 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e  (i=iFirst; i<iEn
37380 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  d; i++){.    int
37390 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20   sz, rc;.    u8 
373a0 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d  *pSlot;.    sz =
373b0 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28   cachedCellSize(
373c0 70 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20  pCArray, i);.   
373d0 20 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d   if( (aData[1]==
373e0 30 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30  0 && aData[2]==0
373f0 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61  ) || (pSlot = pa
37400 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73  geFindSlot(pPg,s
37410 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20  z,&rc))==0 ){.  
37420 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b      pData -= sz;
37430 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
37440 3c 70 42 65 67 69 6e 20 29 20 72 65 74 75 72 6e  <pBegin ) return
37450 20 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20   1;.      pSlot 
37460 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  = pData;.    }. 
37470 20 20 20 6d 65 6d 63 70 79 28 70 53 6c 6f 74 2c     memcpy(pSlot,
37480 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c   pCArray->apCell
37490 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75  [i], sz);.    pu
374a0 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
374b0 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74 61 29   (pSlot - aData)
374c0 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
374d0 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44  += 2;.  }.  *ppD
374e0 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20 20 72  ata = pData;.  r
374f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
37500 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
37510 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20   contains nCell 
37520 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72  pointers to b-tr
37530 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20  ee cells. Array 
37540 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61  szCell .** conta
37550 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
37560 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73 75  bytes of each su
37570 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75  ch cell. This fu
37580 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68 65 0a  nction adds the.
37590 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63 69 61  ** space associa
375a0 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 65  ted with each ce
375b0 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ll in the array 
375c0 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
375d0 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74  y stored .** wit
375e0 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 66 20  hin the body of 
375f0 70 50 67 20 74 6f 20 74 68 65 20 70 50 67 20 66  pPg to the pPg f
37600 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20 63 65  ree-list. The ce
37610 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e 64 20  ll-pointers and 
37620 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20  other.** fields 
37630 6f 66 20 74 68 65 20 70 61 67 65 20 61 72 65 20  of the page are 
37640 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  not updated..**.
37650 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37660 20 72 65 74 75 72 6e 73 20 74 68 65 20 74 6f 74   returns the tot
37670 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  al number of cel
37680 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ls added to the 
37690 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74  free-list..*/.st
376a0 61 74 69 63 20 69 6e 74 20 70 61 67 65 46 72 65  atic int pageFre
376b0 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67  eArray(.  MemPag
376c0 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
376d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
376e0 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69  e to edit */.  i
376f0 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20  nt iFirst,      
37700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37710 2a 20 46 69 72 73 74 20 63 65 6c 6c 20 74 6f 20  * First cell to 
37720 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
37730 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
37740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
37750 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a  ells to delete *
37760 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70  /.  CellArray *p
37770 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20  CArray          
37780 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
37790 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38  cells */.){.  u8
377a0 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
377b0 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
377c0 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d  8 * const pEnd =
377d0 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70 42 74   &aData[pPg->pBt
377e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
377f0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53 74 61   u8 * const pSta
37800 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d  rt = &aData[pPg-
37810 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20 2b  >hdrOffset + 8 +
37820 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72 53 69   pPg->childPtrSi
37830 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20  ze];.  int nRet 
37840 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
37850 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69 72 73  int iEnd = iFirs
37860 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20  t + nCell;.  u8 
37870 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e  *pFree = 0;.  in
37880 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20  t szFree = 0;.. 
37890 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69   for(i=iFirst; i
378a0 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <iEnd; i++){.   
378b0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41   u8 *pCell = pCA
378c0 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b  rray->apCell[i];
378d0 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d  .    if( pCell>=
378e0 70 53 74 61 72 74 20 26 26 20 70 43 65 6c 6c 3c  pStart && pCell<
378f0 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  pEnd ){.      in
37900 74 20 73 7a 3b 0a 20 20 20 20 20 20 2f 2a 20 4e  t sz;.      /* N
37910 6f 20 6e 65 65 64 20 74 6f 20 75 73 65 20 63 61  o need to use ca
37920 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 29 20 68  chedCellSize() h
37930 65 72 65 2e 20 20 54 68 65 20 73 69 7a 65 73 20  ere.  The sizes 
37940 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 74 68 61  of all cells tha
37950 74 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 74  t.      ** are t
37960 6f 20 62 65 20 66 72 65 65 64 20 68 61 76 65 20  o be freed have 
37970 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
37980 70 75 74 69 6e 67 20 77 68 69 6c 65 20 64 65 63  puting while dec
37990 69 64 69 6e 67 20 77 68 69 63 68 0a 20 20 20 20  iding which.    
379a0 20 20 2a 2a 20 63 65 6c 6c 73 20 6e 65 65 64 20    ** cells need 
379b0 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 20 20 20  freeing */.     
379c0 20 73 7a 20 3d 20 70 43 41 72 72 61 79 2d 3e 73   sz = pCArray->s
379d0 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61 73 73 65 72  zCell[i];  asser
379e0 74 28 20 73 7a 3e 30 20 29 3b 0a 20 20 20 20 20  t( sz>0 );.     
379f0 20 69 66 28 20 70 46 72 65 65 21 3d 28 70 43 65   if( pFree!=(pCe
37a00 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20  ll + sz) ){.    
37a10 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b      if( pFree ){
37a20 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
37a30 74 28 20 70 46 72 65 65 3e 61 44 61 74 61 20 26  t( pFree>aData &
37a40 26 20 28 70 46 72 65 65 20 2d 20 61 44 61 74 61  & (pFree - aData
37a50 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20  )<65536 );.     
37a60 20 20 20 20 20 66 72 65 65 53 70 61 63 65 28 70       freeSpace(p
37a70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65 65 20  Pg, (u16)(pFree 
37a80 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65  - aData), szFree
37a90 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37aa0 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 43 65       pFree = pCe
37ab0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72  ll;.        szFr
37ac0 65 65 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20  ee = sz;.       
37ad0 20 69 66 28 20 70 46 72 65 65 2b 73 7a 3e 70 45   if( pFree+sz>pE
37ae0 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  nd ) return 0;. 
37af0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
37b00 20 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c      pFree = pCel
37b10 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65  l;.        szFre
37b20 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d  e += sz;.      }
37b30 0a 20 20 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20  .      nRet++;. 
37b40 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
37b50 46 72 65 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Free ){.    asse
37b60 72 74 28 20 70 46 72 65 65 3e 61 44 61 74 61 20  rt( pFree>aData 
37b70 26 26 20 28 70 46 72 65 65 20 2d 20 61 44 61 74  && (pFree - aDat
37b80 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
37b90 66 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28  freeSpace(pPg, (
37ba0 75 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61  u16)(pFree - aDa
37bb0 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20  ta), szFree);.  
37bc0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b  }.  return nRet;
37bd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c  .}../*.** apCell
37be0 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20  [] and szCell[] 
37bf0 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
37c00 73 20 74 6f 20 61 6e 64 20 73 69 7a 65 73 20 6f  s to and sizes o
37c10 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 74  f all cells in t
37c20 68 65 0a 2a 2a 20 70 61 67 65 73 20 62 65 69 6e  he.** pages bein
37c30 67 20 62 61 6c 61 6e 63 65 64 2e 20 20 54 68 65  g balanced.  The
37c40 20 63 75 72 72 65 6e 74 20 70 61 67 65 2c 20 70   current page, p
37c50 50 67 2c 20 68 61 73 20 70 50 67 2d 3e 6e 43 65  Pg, has pPg->nCe
37c60 6c 6c 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e  ll cells startin
37c70 67 0a 2a 2a 20 77 69 74 68 20 61 70 43 65 6c 6c  g.** with apCell
37c80 5b 69 4f 6c 64 5d 2e 20 20 41 66 74 65 72 20 62  [iOld].  After b
37c90 61 6c 61 6e 63 69 6e 67 2c 20 74 68 69 73 20 70  alancing, this p
37ca0 61 67 65 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20  age should hold 
37cb0 6e 4e 65 77 20 63 65 6c 6c 73 0a 2a 2a 20 73 74  nNew cells.** st
37cc0 61 72 74 69 6e 67 20 61 74 20 61 70 43 65 6c 6c  arting at apCell
37cd0 5b 69 4e 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68  [iNew]..**.** Th
37ce0 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
37cf0 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 61   the necessary a
37d00 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 70 50  djustments to pP
37d10 67 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e  g so that it con
37d20 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72  tains.** the cor
37d30 72 65 63 74 20 63 65 6c 6c 73 20 61 66 74 65 72  rect cells after
37d40 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e   being balanced.
37d50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 67 2d 3e  .**.** The pPg->
37d60 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69  nFree field is i
37d70 6e 76 61 6c 69 64 20 77 68 65 6e 20 74 68 69 73  nvalid when this
37d80 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
37d90 73 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20  s. It is the.** 
37da0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
37db0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
37dc0 73 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79  set it correctly
37dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37de0 65 64 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50  editPage(.  MemP
37df0 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
37e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
37e10 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f  dit this page */
37e20 0a 20 20 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20  .  int iOld,    
37e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e40 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
37e50 69 72 73 74 20 63 65 6c 6c 20 63 75 72 72 65 6e  irst cell curren
37e60 74 6c 79 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  tly on page */. 
37e70 20 69 6e 74 20 69 4e 65 77 2c 20 20 20 20 20 20   int iNew,      
37e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e90 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77   /* Index of new
37ea0 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70   first cell on p
37eb0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  age */.  int nNe
37ec0 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
37ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61           /* Fina
37ee0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
37ef0 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 43  s on page */.  C
37f00 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61  ellArray *pCArra
37f10 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y              /
37f20 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
37f30 20 61 6e 64 20 73 69 7a 65 73 20 2a 2f 0a 29 7b   and sizes */.){
37f40 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
37f50 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
37f60 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  ;.  const int hd
37f70 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
37f80 65 74 3b 0a 20 20 75 38 20 2a 70 42 65 67 69 6e  et;.  u8 *pBegin
37f90 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64   = &pPg->aCellId
37fa0 78 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20 20 69  x[nNew * 2];.  i
37fb0 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 50 67 2d 3e  nt nCell = pPg->
37fc0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  nCell;       /* 
37fd0 43 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20  Cells stored on 
37fe0 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 70 44 61  pPg */.  u8 *pDa
37ff0 74 61 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70  ta;.  u8 *pCellp
38000 74 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  tr;.  int i;.  i
38010 6e 74 20 69 4f 6c 64 45 6e 64 20 3d 20 69 4f 6c  nt iOldEnd = iOl
38020 64 20 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 2b  d + pPg->nCell +
38030 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b   pPg->nOverflow;
38040 0a 20 20 69 6e 74 20 69 4e 65 77 45 6e 64 20 3d  .  int iNewEnd =
38050 20 69 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a 0a 23   iNew + nNew;..#
38060 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
38070 55 47 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20  UG.  u8 *pTmp = 
38080 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70  sqlite3PagerTemp
38090 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e  Space(pPg->pBt->
380a0 70 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70  pPager);.  memcp
380b0 79 28 70 54 6d 70 2c 20 61 44 61 74 61 2c 20 70  y(pTmp, aData, p
380c0 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
380d0 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ize);.#endif..  
380e0 2f 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c 73 20  /* Remove cells 
380f0 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 61  from the start a
38100 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  nd end of the pa
38110 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4f 6c 64  ge */.  if( iOld
38120 3c 69 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74  <iNew ){.    int
38130 20 6e 53 68 69 66 74 20 3d 20 70 61 67 65 46 72   nShift = pageFr
38140 65 65 41 72 72 61 79 28 70 50 67 2c 20 69 4f 6c  eeArray(pPg, iOl
38150 64 2c 20 69 4e 65 77 2d 69 4f 6c 64 2c 20 70 43  d, iNew-iOld, pC
38160 41 72 72 61 79 29 3b 0a 20 20 20 20 6d 65 6d 6d  Array);.    memm
38170 6f 76 65 28 70 50 67 2d 3e 61 43 65 6c 6c 49 64  ove(pPg->aCellId
38180 78 2c 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64  x, &pPg->aCellId
38190 78 5b 6e 53 68 69 66 74 2a 32 5d 2c 20 6e 43 65  x[nShift*2], nCe
381a0 6c 6c 2a 32 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  ll*2);.    nCell
381b0 20 2d 3d 20 6e 53 68 69 66 74 3b 0a 20 20 7d 0a   -= nShift;.  }.
381c0 20 20 69 66 28 20 69 4e 65 77 45 6e 64 20 3c 20    if( iNewEnd < 
381d0 69 4f 6c 64 45 6e 64 20 29 7b 0a 20 20 20 20 6e  iOldEnd ){.    n
381e0 43 65 6c 6c 20 2d 3d 20 70 61 67 65 46 72 65 65  Cell -= pageFree
381f0 41 72 72 61 79 28 70 50 67 2c 20 69 4e 65 77 45  Array(pPg, iNewE
38200 6e 64 2c 20 69 4f 6c 64 45 6e 64 20 2d 20 69 4e  nd, iOldEnd - iN
38210 65 77 45 6e 64 2c 20 70 43 41 72 72 61 79 29 3b  ewEnd, pCArray);
38220 0a 20 20 7d 0a 0a 20 20 70 44 61 74 61 20 3d 20  .  }..  pData = 
38230 26 61 44 61 74 61 5b 67 65 74 32 62 79 74 65 4e  &aData[get2byteN
38240 6f 74 5a 65 72 6f 28 26 61 44 61 74 61 5b 68 64  otZero(&aData[hd
38250 72 2b 35 5d 29 5d 3b 0a 20 20 69 66 28 20 70 44  r+5])];.  if( pD
38260 61 74 61 3c 70 42 65 67 69 6e 20 29 20 67 6f 74  ata<pBegin ) got
38270 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b  o editpage_fail;
38280 0a 0a 20 20 2f 2a 20 41 64 64 20 63 65 6c 6c 73  ..  /* Add cells
38290 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
382a0 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   the page */.  i
382b0 66 28 20 69 4e 65 77 3c 69 4f 6c 64 20 29 7b 0a  f( iNew<iOld ){.
382c0 20 20 20 20 69 6e 74 20 6e 41 64 64 20 3d 20 4d      int nAdd = M
382d0 49 4e 28 6e 4e 65 77 2c 69 4f 6c 64 2d 69 4e 65  IN(nNew,iOld-iNe
382e0 77 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  w);.    assert( 
382f0 28 69 4f 6c 64 2d 69 4e 65 77 29 3c 6e 4e 65 77  (iOld-iNew)<nNew
38300 20 7c 7c 20 6e 43 65 6c 6c 3d 3d 30 20 7c 7c 20   || nCell==0 || 
38310 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
38320 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67    pCellptr = pPg
38330 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 20 20  ->aCellIdx;.    
38340 6d 65 6d 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74  memmove(&pCellpt
38350 72 5b 6e 41 64 64 2a 32 5d 2c 20 70 43 65 6c 6c  r[nAdd*2], pCell
38360 70 74 72 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20  ptr, nCell*2);. 
38370 20 20 20 69 66 28 20 70 61 67 65 49 6e 73 65 72     if( pageInser
38380 74 41 72 72 61 79 28 0a 20 20 20 20 20 20 20 20  tArray(.        
38390 20 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26    pPg, pBegin, &
383a0 70 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c  pData, pCellptr,
383b0 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 2c  .          iNew,
383c0 20 6e 41 64 64 2c 20 70 43 41 72 72 61 79 0a 20   nAdd, pCArray. 
383d0 20 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74     ) ) goto edit
383e0 70 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20 6e  page_fail;.    n
383f0 43 65 6c 6c 20 2b 3d 20 6e 41 64 64 3b 0a 20 20  Cell += nAdd;.  
38400 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6e 79 20  }..  /* Add any 
38410 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2a  overflow cells *
38420 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
38430 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20 69  Pg->nOverflow; i
38440 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 65  ++){.    int iCe
38450 6c 6c 20 3d 20 28 69 4f 6c 64 20 2b 20 70 5