/ Hex Artifact Content
Login

Artifact 5c97b88747010ac1f856477d35e18e6ff357d506:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62 20  ){.        iTab 
1920: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1930: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1940: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1950: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1960: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1970: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1980: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
1990: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19a0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19b0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19c0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19d0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19e0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
19f0: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a00: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a10: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a20: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a30: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a40: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a50: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a60: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a70: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a80: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1a90: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1aa0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ab0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ac0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ad0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1ae0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1af0: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b00: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b10: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b30: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b40: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b50: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b60: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b70: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b80: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1b90: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1ba0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bb0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bc0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1bd0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1be0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1bf0: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c00: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c10: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c20: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c30: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c40: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c50: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c70: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c80: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1c90: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1ca0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cb0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cc0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1cd0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1ce0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1cf0: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d00: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d10: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d20: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d30: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d40: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d50: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d60: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d70: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d80: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1d90: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1da0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1db0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dc0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1de0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1df0: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e00: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e10: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e20: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e30: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e40: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e50: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e60: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e70: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e80: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1e90: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1ea0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1eb0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ec0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ed0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ee0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1ef0: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f00: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f10: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f20: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f30: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f40: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f50: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f80: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1f90: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fa0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fb0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fc0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fd0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1fe0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
1ff0: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2000: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2010: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2020: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2030: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2040: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2050: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2060: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2070: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2080: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
2090: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20b0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20c0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20d0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20e0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
20f0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2100: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2110: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2130: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2140: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2150: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2160: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2170: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2180: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2190: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21a0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21b0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21c0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21d0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21e0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
21f0: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2200: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2210: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2220: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2230: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2240: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2250: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2260: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2270: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2280: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
2290: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22a0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22b0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22c0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22d0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22e0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22f0: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2300: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2310: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2320: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2330: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2350: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2360: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2370: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2380: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
2390: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23b0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23c0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23d0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23e0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
23f0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2400: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2410: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2420: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2430: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2440: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2450: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2460: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2470: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2480: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
2490: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24a0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24b0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24c0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24d0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24e0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
24f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2500: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2510: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2520: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2530: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2540: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2550: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2560: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2570: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2580: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2590: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25b0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25c0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25d0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25e0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
25f0: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2600: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2610: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2620: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2630: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2640: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2650: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2660: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2670: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2680: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
2690: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26b0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26c0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26d0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26e0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
26f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2700: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2710: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2720: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2730: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2740: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2750: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2760: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2770: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2780: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2790: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27a0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27b0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27c0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27d0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
27f0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2800: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2810: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2820: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2830: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2840: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2850: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2860: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2870: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2880: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
2890: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28a0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28b0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28c0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28d0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28e0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
28f0: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2900: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2910: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2920: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2930: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2940: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2950: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2960: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2970: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2980: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
2990: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29a0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29b0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29c0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29d0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29e0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
29f0: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a00: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a10: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a20: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a30: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a40: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a50: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a60: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a70: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a80: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2a90: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2aa0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ab0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ac0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ad0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ae0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2af0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b00: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b10: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b20: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b30: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b50: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b60: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b70: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2b90: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2ba0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bb0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bc0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2bd0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2be0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2bf0: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c00: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c10: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c20: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c30: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c40: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c50: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c60: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c70: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c80: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2c90: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cb0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cc0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2cd0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2ce0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2cf0: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d00: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d10: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d20: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d30: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d40: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d50: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d60: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d70: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d80: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2d90: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2da0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2db0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dc0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2dd0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2de0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2df0: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e10: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e20: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e30: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e40: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e50: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e60: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e70: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2e90: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2ea0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2eb0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ec0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ed0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ee0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2ef0: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f00: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f20: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f30: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f40: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f50: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f60: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f70: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f80: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2f90: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fa0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fb0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fc0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fd0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2fe0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
2ff0: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3000: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3020: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3030: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3040: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3050: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3060: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3070: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
3090: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30a0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30b0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30c0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30e0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
30f0: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3100: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3110: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3120: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3130: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3140: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3150: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3160: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3170: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3180: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
3190: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31a0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31b0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31c0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31d0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31e0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
31f0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3200: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3210: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3220: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3230: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3240: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3250: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3260: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3270: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3280: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
3290: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32a0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32b0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32c0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32d0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32e0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
32f0: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3300: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3310: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3320: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3330: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3340: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3360: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3370: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3380: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3390: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33a0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33b0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33c0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33d0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33e0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
33f0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3400: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3420: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3430: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3440: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3450: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3460: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3470: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3480: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
3490: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34a0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34c0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34d0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34e0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
34f0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3500: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3510: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3520: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3530: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3540: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3550: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3560: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3570: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3580: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
3590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35a0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35b0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35d0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35e0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
35f0: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3600: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3610: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3620: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3630: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3640: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3650: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3660: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3670: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3680: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
3690: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36b0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36c0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36e0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
36f0: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3700: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3710: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3720: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3730: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3740: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3750: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3760: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3770: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3780: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
3790: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37a0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37b0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37c0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37e0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
37f0: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3800: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3810: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3820: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3830: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3840: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3850: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3860: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3870: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3880: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3890: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38a0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38b0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38c0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38d0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38e0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
38f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3900: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3910: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3920: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3930: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3940: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3950: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3960: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3970: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3980: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3990: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39a0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39b0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39c0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39e0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
39f0: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a00: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a10: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a20: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a30: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a50: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a60: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a70: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a80: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3a90: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3aa0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ab0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ac0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ad0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3ae0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3af0: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b00: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b10: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b40: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b50: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b60: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b70: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b80: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3b90: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3ba0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bb0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bc0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3bd0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3be0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3bf0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c00: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c10: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c20: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c30: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c40: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c50: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c60: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c70: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c80: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3c90: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3ca0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cb0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3cd0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3ce0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3cf0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d00: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d20: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d30: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d40: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d50: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d60: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d70: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d90: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3da0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3db0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dc0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3dd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3de0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3df0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e00: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e10: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e20: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e30: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e40: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e50: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e60: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e70: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e80: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3e90: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3ea0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3eb0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ec0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ed0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ee0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3ef0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f00: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f10: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f20: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f30: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f40: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f50: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f60: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f70: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f80: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3f90: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fa0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fb0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fc0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fd0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ff0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4000: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4010: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4020: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4030: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4040: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4050: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4060: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4070: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4080: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
4090: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40b0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40c0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40d0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
40f0: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4100: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4110: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4120: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4130: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4140: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4150: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4160: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4170: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4180: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
4190: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41a0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41b0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41c0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41e0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
41f0: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4200: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4210: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4220: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4230: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4240: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4250: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4260: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4270: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4280: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4290: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42a0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42b0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42c0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42d0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42e0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
42f0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4300: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4310: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4320: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4330: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4340: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4350: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4360: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4370: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4380: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
4390: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43a0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43b0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43c0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43d0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43e0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
43f0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4400: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4410: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4420: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4430: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4440: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4450: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4460: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4470: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4480: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
4490: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44a0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44b0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44c0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44d0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
44f0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4500: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4510: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4520: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4530: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4540: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4550: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4560: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4570: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4580: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
4590: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45a0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45b0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45c0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45d0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45e0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
45f0: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4600: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4610: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4620: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4630: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4640: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4650: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4660: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4670: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4680: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
4690: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46a0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46b0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46c0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46d0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46e0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
46f0: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4700: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4710: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4720: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4730: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4740: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4750: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4760: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4770: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4780: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
4790: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47a0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47b0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47d0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47e0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
47f0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4800: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4810: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4820: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4830: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4840: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4850: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4860: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4870: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4880: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4890: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48b0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48c0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48d0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48e0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
48f0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4900: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4910: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4920: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4930: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4950: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4960: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4970: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4980: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
4990: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49c0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49d0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49e0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
49f0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a00: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a10: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a20: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a50: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a60: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a80: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4a90: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4aa0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ab0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ac0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ad0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4ae0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4af0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b00: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b20: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b30: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b40: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b50: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b60: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b70: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b80: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4b90: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4ba0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bb0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bc0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4bd0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4be0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4bf0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c00: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c10: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c20: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c30: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c40: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c50: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c60: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c70: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c80: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4c90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4ca0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cb0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cc0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4cd0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4ce0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4cf0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d20: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d30: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d40: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d50: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d70: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d80: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4d90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4da0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4db0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4dd0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4de0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4df0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e10: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e30: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e40: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e50: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e60: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e70: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e80: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4e90: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4ea0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4eb0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ec0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ed0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ee0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4ef0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f00: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f10: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f20: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f30: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f40: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f50: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f60: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f70: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f80: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4f90: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fa0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fb0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fc0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fd0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4fe0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
4ff0: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5000: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5010: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5020: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
5030: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
5040: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
5050: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
5060: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5070: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
5080: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
5090: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
50a0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
50b0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
50c0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
50d0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
50e0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
50f0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
5100: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5110: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
5120: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
5130: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
5140: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
5150: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5160: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
5170: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
5180: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
5190: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
51a0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
51b0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
51c0: 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ( 0==pCur->apPag
51d0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
51e0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
51f0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5200: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5210: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5220: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5230: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
5240: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
5250: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
5260: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5270: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
5280: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
5290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
52a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
52b0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
52c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
52d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
52e0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
52f0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5300: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5310: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5320: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5330: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5340: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5350: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
5360: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5370: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5380: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5390: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
53a0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
53b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
53c0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
53d0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
53e0: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
53f0: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
5400: 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67  ist(BtCursor*,Pg
5410: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
5420: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
5430: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
5440: 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20  cursors (except 
5450: 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72  pExcept) that ar
5460: 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  e open on.** the
5470: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5480: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53  -page iRoot.  "S
5490: 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  aving the cursor
54a0: 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73   position" means
54b0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63   that.** the loc
54c0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72  ation in the btr
54d0: 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64  ee is remembered
54e0: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
54f0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  hat it can be.**
5500: 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74   moved back to t
5510: 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74  he same spot aft
5520: 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73  er the btree has
5530: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
5540: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
5550: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
5560: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45  before cursor pE
5570: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5580: 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74   modify the.** t
5590: 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  able, for exampl
55a0: 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65  e in BtreeDelete
55b0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
55c0: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  t()..**.** Imple
55d0: 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  mentation note: 
55e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65   This routine me
55f0: 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73  rely checks to s
5600: 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  ee if any cursor
5610: 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20  s.** need to be 
5620: 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73  saved.  It calls
5630: 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73   out to saveCurs
5640: 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74  orsOnList() in t
5650: 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20  he (unusual).** 
5660: 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f  event that curso
5670: 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74  rs are in need t
5680: 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a  o being saved..*
5690: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
56a0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
56b0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
56c0: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
56d0: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
56e0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
56f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5700: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5710: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5720: 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45  pExcept==0 || pE
5730: 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20  xcept->pBt==pBt 
5740: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
5750: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
5760: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
5770: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
5780: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
5790: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
57a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
57b0: 65 74 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75  eturn p ? saveCu
57c0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69  rsorsOnList(p, i
57d0: 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a  Root, pExcept) :
57e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
57f0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5800: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5810: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5820: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5830: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5840: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5850: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5860: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5870: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5880: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
5890: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
58a0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
58b0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
58c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
58d0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
58e0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
58f0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5900: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5910: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5920: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5930: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5940: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5950: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5960: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5970: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5980: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
5990: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
59a0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
59b0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
59c0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
59d0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
59e0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
59f0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5a00: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5a10: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5a20: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a30: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a40: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5a60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5a70: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5a80: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5a90: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5aa0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5ab0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5ad0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5af0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5b00: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5b10: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5b20: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
5b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5b40: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
5b50: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
5b60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
5b80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
5b90: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
5ba0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
5bb0: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
5bc0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5bd0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5be0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5c00: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5c10: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5c20: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
5c30: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
5c50: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
5c60: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
5c70: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
5c80: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
5c90: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
5ca0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
5cb0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
5cc0: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
5cd0: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
5ce0: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
5cf0: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
5d00: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
5d10: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
5d20: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
5d30: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
5d40: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
5d50: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
5d60: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
5d70: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
5d80: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
5d90: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
5da0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
5db0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
5dc0: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
5dd0: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
5de0: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
5df0: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
5e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
5e10: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
5e20: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
5e30: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
5e40: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
5e50: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
5e60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
5e90: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
5ea0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
5eb0: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
5ec0: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
5ed0: 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20  r aSpace[200];  
5ee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
5ef0: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
5f00: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
5f10: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
5f20: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
5f30: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5f40: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5f50: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5f60: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
5f70: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
5f80: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
5f90: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
5fa0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
5fb0: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
5fc0: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
5fd0: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
5fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5ff0: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
6000: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6010: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6020: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6030: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6040: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6050: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
6060: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6070: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6080: 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  , pFree);.      
6090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
60a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
60b0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
60c0: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
60d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
60e0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
60f0: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6100: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6110: 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
6120: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6130: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6140: 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b  nfo->db, pFree);
6150: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
6170: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
6180: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
6190: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
61a0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
61b0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
61c0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
61d0: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
61e0: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
61f0: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6200: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6210: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6220: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6230: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6240: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6250: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
6260: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6270: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
6280: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
6290: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
62a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
62b0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
62c0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
62d0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
62e0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
62f0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6300: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6310: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6320: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6330: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6340: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6350: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6360: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6370: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6380: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6390: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
63a0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
63b0: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
63c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
63d0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b  pCur->skipNext);
63e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
63f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6400: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6410: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
6420: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
6430: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6440: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6450: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
6460: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
6470: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
6480: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
6490: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
64a0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
64b0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
64c0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
64e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
64f0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
6500: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
6510: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
6520: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6530: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
6540: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6550: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
6560: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
6570: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
6580: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6590: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
65a0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
65b0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
65c0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
65d0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
65e0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
65f0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
6600: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
6610: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6620: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6630: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
6640: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
6650: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
6660: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
6670: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
6680: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
6690: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
66a0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
66b0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
66c0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
66d0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
66e0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
66f0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
6700: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
6710: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
6720: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
6730: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
6740: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
6750: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
6760: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
6770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6780: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6790: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
67a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
67b0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
67c0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
67d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
67e0: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
67f0: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
6800: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
6810: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6820: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6830: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6840: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6850: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6860: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6870: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
6880: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
6890: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
68a0: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
68b0: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
68c0: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
68d0: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
68e0: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
68f0: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
6900: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6910: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6920: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6930: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6940: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6950: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6960: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6970: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
6980: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
6990: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
69a0: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
69b0: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
69c0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
69d0: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
69e0: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
69f0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6a00: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6a10: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6a20: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6a30: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6a40: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6a50: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6a60: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6a70: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6a80: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
6a90: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
6aa0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6ab0: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
6ac0: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
6ad0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6ae0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6af0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6b00: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6b10: 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
6b20: 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a  skipNext!=0) ){.
6b30: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6b40: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
6b50: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
6b60: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
6b70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6b80: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6b90: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6ba0: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
6bb0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
6bc0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
6bd0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
6be0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
6bf0: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
6c00: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
6c10: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
6c20: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
6c30: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
6c40: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6c50: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
6c60: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
6c70: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
6c80: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
6c90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6ca0: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
6cb0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
6cc0: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
6cd0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
6ce0: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
6cf0: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
6d00: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
6d10: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
6d20: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
6d30: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
6d40: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
6d50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6d60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6d70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
6d80: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
6d90: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
6da0: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
6db0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
6dc0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
6dd0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
6de0: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
6df0: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
6e00: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
6e10: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
6e20: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6e30: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
6e40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
6e50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
6e60: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
6e70: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6e80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6e90: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
6ea0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6eb0: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
6ec0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
6ed0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
6ee0: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
6ef0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
6f00: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
6f10: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
6f20: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
6f30: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
6f40: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
6f50: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
6f60: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6f70: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
6f80: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
6f90: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
6fa0: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
6fb0: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
6fc0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
6fd0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
6fe0: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
6ff0: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
7000: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
7010: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7020: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
7030: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
7040: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7050: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
7060: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
7070: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7080: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
7090: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
70a0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
70b0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
70c0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
70d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
70e0: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
70f0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7100: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7110: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7120: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7130: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7140: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7150: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7160: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7170: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
7180: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7190: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
71a0: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
71b0: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
71c0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
71d0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
71e0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
71f0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7200: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7210: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7220: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7230: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7240: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7250: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7260: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7270: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
7280: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
7290: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
72a0: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
72b0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
72c0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
72d0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
72e0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
72f0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7300: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7310: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7320: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7330: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7340: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7350: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7360: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7370: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7380: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7390: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
73a0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
73b0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
73c0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
73d0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
73e0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
73f0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7400: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7410: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7420: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7430: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7440: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7450: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7460: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7470: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7480: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7490: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
74a0: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
74b0: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
74c0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
74d0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
74e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
74f0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7500: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7510: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7520: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7530: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7540: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7550: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7560: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7570: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
7580: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
7590: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
75a0: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
75b0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
75c0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
75d0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
75e0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
75f0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7600: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7610: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7620: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7630: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7640: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7650: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7660: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7670: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
7680: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
7690: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
76a0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
76b0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
76c0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
76d0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
76e0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
76f0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7700: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7710: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7720: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7730: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7740: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7750: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7760: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7770: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
7780: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
7790: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
77a0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
77b0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
77c0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
77d0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
77e0: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
77f0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7800: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7810: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7820: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7830: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7840: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7850: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7860: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7870: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7880: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7890: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
78a0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
78b0: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
78c0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
78d0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
78e0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
78f0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
7900: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
7910: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7920: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
7930: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
7940: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7950: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7970: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
7980: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
7990: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
79a0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
79b0: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
79c0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
79d0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
79e0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
79f0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
7a00: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
7a10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
7a20: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
7a30: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
7a40: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7a50: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
7a60: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
7a70: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
7a80: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
7a90: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
7aa0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
7ab0: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
7ac0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
7ad0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
7ae0: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
7af0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
7b00: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
7b10: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
7b20: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
7b30: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
7b40: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65  t2byte(&(P)->aCe
7b50: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
7b60: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7b70: 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28  v2(D,M,O,I) (D+(
7b80: 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b  M&get2byte(D+(O+
7b90: 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I))))).../*.*
7ba0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
7bb0: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
7bc0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
7bd0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
7be0: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
7bf0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
7c00: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ls..*/.static u8
7c10: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
7c20: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
7c30: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
7c40: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
7c50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7c60: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7c70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
7c80: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
7c90: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
7ca0: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
7cb0: 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f    k = pPage->aiO
7cc0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  vfl[i];.    if( 
7cd0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
7ce0: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
7cf0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7d00: 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69   pPage->apOvfl[i
7d10: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
7d20: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7d30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7d40: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7d50: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7d60: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
7d70: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
7d80: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
7d90: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
7da0: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
7db0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
7dc0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7dd0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7de0: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7df0: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7e00: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7e10: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7e20: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7e30: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7e40: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7e50: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7e60: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7e70: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7e80: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7e90: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7ea0: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7eb0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7ec0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7ed0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7ee0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7ef0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7f00: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7f10: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7f20: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
7f30: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
7f40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
7f50: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
7f60: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
7f70: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
7f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
7f90: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
7fa0: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
7fb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7fc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
7fd0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
7fe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
7ff0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
8000: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
8010: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
8020: 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
8030: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8040: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
8050: 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70  );.    pIter = p
8060: 43 65 6c 6c 20 2b 20 67 65 74 56 61 72 69 6e 74  Cell + getVarint
8070: 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f  32(pCell, nPaylo
8080: 61 64 29 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  ad);.    pIter +
8090: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
80a0: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
80b0: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 20  >nKey);.  }else 
80c0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  if( pPage->noPay
80d0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61 73 73 65  load ){.    asse
80e0: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
80f0: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8100: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
8110: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
8120: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
8130: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8140: 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f     pInfo->nPaylo
8150: 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66  ad = 0;.    pInf
8160: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
8170: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
8180: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  low = 0;.    pIn
8190: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
81a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
81b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
81c0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
81d0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
81e0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
81f0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
8200: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
8210: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
8220: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
8230: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8240: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8250: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8260: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8270: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
8280: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
8290: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
82a0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
82b0: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
82c0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
82d0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
82e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
82f0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
8300: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
8310: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8320: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8330: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8340: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8350: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8360: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8370: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
8380: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
8390: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
83a0: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
83b0: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
83c0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
83d0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
83e0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
83f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8400: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
8410: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8420: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8430: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8440: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8450: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8460: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8470: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8480: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8490: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
84a0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
84b0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
84c0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
84d0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
84e0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
84f0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8500: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8510: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8520: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8530: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8540: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8550: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8560: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8570: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
8580: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
8590: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
85a0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
85b0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
85c0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
85d0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
85e0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
85f0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8600: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8610: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8620: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8630: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8640: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8650: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8660: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8670: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8680: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8690: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
86a0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
86b0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
86c0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
86d0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
86e0: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
86f0: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
8700: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
8710: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8720: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
8730: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8740: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
8750: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8760: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8770: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
8780: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
8790: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
87a0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
87b0: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
87c0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
87d0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
87e0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
87f0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8800: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8810: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8820: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8830: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
8840: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
8850: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
8860: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
8870: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
8880: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8890: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
88a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
88b0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
88c0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
88d0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
88e0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
88f0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
8900: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
8910: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8920: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8930: 7b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  {.  btreeParseCe
8940: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
8950: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
8960: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
8970: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
8980: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8990: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
89a0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
89b0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
89c0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
89d0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
89e0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
89f0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
8a00: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
8a10: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
8a20: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
8a30: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
8a40: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
8a50: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
8a60: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
8a70: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
8a80: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
8a90: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
8aa0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
8ab0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8ac0: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
8ad0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
8ae0: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
8af0: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b10: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
8b20: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
8b30: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8b60: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
8b70: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
8b80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8b90: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
8ba0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
8bb0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
8bc0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
8bd0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
8be0: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
8bf0: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
8c00: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
8c10: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
8c20: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
8c30: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
8c40: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
8c50: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
8c60: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
8c70: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
8c80: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
8c90: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
8ca0: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
8cb0: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
8cc0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8cd0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
8ce0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
8cf0: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
8d00: 61 64 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  ad ){.    pEnd =
8d10: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
8d20: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
8d30: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
8d40: 70 45 6e 64 20 29 3b 0a 20 20 20 20 61 73 73 65  pEnd );.    asse
8d50: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8d60: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8d70: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
8d80: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
8d90: 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49   }.  nSize = *pI
8da0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
8db0: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
8dc0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
8dd0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
8de0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
8df0: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
8e00: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
8e10: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
8e20: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
8e30: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8e40: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
8e50: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
8e60: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
8e70: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
8e80: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
8e90: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
8ea0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
8eb0: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
8ec0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
8ed0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
8ee0: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
8ef0: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
8f00: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
8f10: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
8f20: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
8f30: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
8f40: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
8f50: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
8f60: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8f70: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8f80: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8f90: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8fa0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8fb0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8fc0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
8fd0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8fe0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
8ff0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9000: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
9010: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
9020: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
9030: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
9040: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
9050: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
9060: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
9070: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
9080: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
9090: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
90a0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
90b0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
90c0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
90d0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
90e0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
90f0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
9100: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
9110: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
9120: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
9130: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
9140: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9150: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
9160: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
9170: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
9180: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
9190: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
91a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
91b0: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
91c0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
91d0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
91e0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
91f0: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
9200: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
9210: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
9220: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
9230: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
9240: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9250: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9260: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
9270: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
9280: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9290: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
92a0: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
92b0: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
92c0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
92d0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
92e0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
92f0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
9300: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
9310: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9320: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9330: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
9340: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
9350: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
9360: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
9370: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
9380: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
9390: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
93a0: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
93b0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
93c0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
93d0: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
93e0: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
93f0: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
9400: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
9410: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
9420: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
9430: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9440: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9450: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
9460: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9470: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
9480: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
9490: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
94a0: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
94b0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
94c0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
94d0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
94e0: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
94f0: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
9500: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
9510: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
9520: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
9530: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
9540: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9560: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
9570: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
9580: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
95a0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
95b0: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
95d0: 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
95e0: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
95f0: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
9600: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9610: 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  et to the page h
9620: 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73  eader */.  int s
9630: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
9640: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9650: 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
9660: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
9670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9680: 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65  r of usable byte
9690: 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s on a page */. 
96a0: 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
96c0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
96d0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
96e0: 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20  */.  int cbrk;  
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9700: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
9710: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
9720: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
9730: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9740: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9750: 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
9760: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
9770: 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
9780: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61    /* The page da
9790: 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ta */.  unsigned
97a0: 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20   char *temp;    
97b0: 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20     /* Temp area 
97c0: 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  for cell content
97d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
97e0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
97f0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
9800: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
9810: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
9820: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
9830: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
9840: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
9850: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9860: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9870: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
9880: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9890: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
98a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
98b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
98c0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
98d0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
98e0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
98f0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
9900: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9910: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9920: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9930: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
9940: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
9950: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
9960: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
9970: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
9980: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
9990: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
99a0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
99b0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
99c0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
99d0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
99e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
99f0: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
9a00: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
9a10: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
9a20: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
9a30: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
9a40: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
9a50: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
9a60: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
9a70: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
9a80: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
9a90: 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c  iCellFirst = cel
9aa0: 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c  lOffset + 2*nCel
9ab0: 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
9ac0: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
9ad0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
9ae0: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
9af0: 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a  8 *pAddr;     /*
9b00: 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70   The i-th cell p
9b10: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41  ointer */.    pA
9b20: 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  ddr = &data[cell
9b30: 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20  Offset + i*2];. 
9b40: 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65     pc = get2byte
9b50: 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73  (pAddr);.    tes
9b60: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
9b70: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9b80: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
9b90: 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66  Last );.#if !def
9ba0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
9bb0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
9bc0: 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54  _CHECK).    /* T
9bd0: 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20  hese conditions 
9be0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
9bf0: 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74  n verified in bt
9c00: 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20  reeInitPage().  
9c10: 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45    ** if SQLITE_E
9c20: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
9c30: 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66  ELL_CHECK is def
9c40: 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ined .    */.   
9c50: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
9c60: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
9c70: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9c80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9c90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9ca0: 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28  ndif.    assert(
9cb0: 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc>=iCellFirst 
9cc0: 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74  && pc<=iCellLast
9cd0: 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63   );.    size = c
9ce0: 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
9cf0: 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20  , &temp[pc]);.  
9d00: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
9d10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
9d20: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
9d30: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
9d40: 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c     if( cbrk<iCel
9d50: 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  lFirst ){.      
9d60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9d70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9d80: 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20  }.#else.    if( 
9d90: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
9da0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
9db0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
9dc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9dd0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
9de0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
9df0: 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75  rt( cbrk+size<=u
9e00: 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72  sableSize && cbr
9e10: 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  k>=iCellFirst );
9e20: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63  .    testcase( c
9e30: 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65  brk+size==usable
9e40: 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74  Size );.    test
9e50: 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75  case( pc+size==u
9e60: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
9e70: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
9e80: 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20  rk], &temp[pc], 
9e90: 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32 62  size);.    put2b
9ea0: 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29  yte(pAddr, cbrk)
9eb0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9ec0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
9ed0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
9ee0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
9ef0: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
9f00: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
9f10: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
9f20: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
9f30: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
9f40: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
9f50: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
9f60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9f70: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
9f80: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9f90: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
9fa0: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
9fb0: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
9fc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9fd0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
9fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9ff0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
a000: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
a010: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
a020: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
a030: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
a040: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
a050: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
a060: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
a070: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
a080: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
a090: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
a0a0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
a0b0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
a0c0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
a0d0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
a0e0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
a0f0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
a100: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
a110: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
a120: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
a130: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
a140: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
a150: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
a160: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
a170: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
a180: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
a190: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
a1a0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
a1b0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
a1c0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
a1d0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
a1e0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
a1f0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
a200: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
a210: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
a220: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
a230: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
a240: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
a250: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
a260: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
a270: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
a280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
a290: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
a2a0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
a2b0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
a2c0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
a2d0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
a2e0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
a2f0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
a300: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
a310: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
a320: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
a330: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
a340: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
a350: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
a360: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
a370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a380: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
a390: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a3a0: 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  a */.  int gap; 
a3b0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
a3c0: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
a3d0: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
a3e0: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
a3f0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  nt */.  int rc; 
a400: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
a410: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
a420: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
a430: 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
a440: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  ze of the page *
a450: 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  /.  .  assert( s
a460: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
a470: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
a480: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
a490: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
a4a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
a4b0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
a4c0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
a4d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
a4e0: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
a4f0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
a500: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
a510: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
a520: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
a530: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
a540: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 75 73 61  flow==0 );.  usa
a550: 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d  bleSize = pPage-
a560: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a570: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
a580: 65 20 3c 20 75 73 61 62 6c 65 53 69 7a 65 2d 38  e < usableSize-8
a590: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
a5a0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
a5b0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
a5c0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
a5d0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
a5e0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
a5f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
a600: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
a610: 20 29 3b 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   );.  top = get2
a620: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
a630: 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f  ]);.  if( gap>to
a640: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70  p ){.    if( top
a650: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 6f 70  ==0 ){.      top
a660: 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65   = 65536;.    }e
a670: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
a680: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a690: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BKPT;.    }.  }
a6a0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
a6b0: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  is enough space 
a6c0: 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20  between gap and 
a6d0: 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65  top for one more
a6e0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20   cell pointer.  
a6f0: 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f  ** array entry o
a700: 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68  ffset, and if th
a710: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f  e freelist is no
a720: 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65  t empty, then se
a730: 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72  arch the.  ** fr
a740: 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66  eelist looking f
a750: 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62  or a free slot b
a760: 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74  ig enough to sat
a770: 69 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74  isfy the request
a780: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
a790: 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b  e( gap+2==top );
a7a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
a7b0: 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +1==top );.  tes
a7c0: 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20  tcase( gap==top 
a7d0: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d  );.  if( gap+2<=
a7e0: 74 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64 72  top && (data[hdr
a7f0: 2b 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +1] || data[hdr+
a800: 32 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 70  2]) ){.    int p
a810: 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f 72  c, addr;.    for
a820: 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63  (addr=hdr+1; (pc
a830: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
a840: 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64 64  a[addr]))>0; add
a850: 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e 74  r=pc){.      int
a860: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
a870: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
a880: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
a890: 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c      if( pc>usabl
a8a0: 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61 64  eSize-4 || pc<ad
a8b0: 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  dr+4 ){.        
a8c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a8d0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a8e0: 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20 3d    }.      size =
a8f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a900: 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  pc+2]);.      if
a910: 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b  ( size>=nByte ){
a920: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d  .        int x =
a930: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20   size - nByte;. 
a940: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
a950: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20   x==4 );.       
a960: 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20   testcase( x==3 
a970: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  );.        if( x
a980: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
a990: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 3e  if( data[hdr+7]>
a9a0: 3d 36 30 20 29 20 67 6f 74 6f 20 64 65 66 72 61  =60 ) goto defra
a9b0: 67 6d 65 6e 74 5f 70 61 67 65 3b 0a 20 20 20 20  gment_page;.    
a9c0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
a9d0: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
a9e0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
a9f0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
aa00: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
aa10: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
aa20: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
aa30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
aa40: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
aa50: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
aa60: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
aa70: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
aa80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
aa90: 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61  f( size+pc > usa
aaa0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
aab0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
aac0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
aad0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
aae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
aaf0: 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e   slot remains on
ab00: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
ab10: 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20  Reduce its size 
ab20: 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20  to account.     
ab30: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
ab40: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
ab50: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
ab60: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  on. */.         
ab70: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ab80: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
ab90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49     }.        *pI
aba0: 64 78 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20  dx = pc + x;.   
abb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
abc0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
abd0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
abe0: 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64  he request could
abf0: 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65   not be fulfille
ac00: 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69  d using a freeli
ac10: 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a  st slot.  Check.
ac20: 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64    ** to see if d
ac30: 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69  efragmentation i
ac40: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  s necessary..  *
ac50: 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  /.  testcase( ga
ac60: 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29  p+2+nByte==top )
ac70: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42  ;.  if( gap+2+nB
ac80: 79 74 65 3e 74 6f 70 20 29 7b 0a 64 65 66 72 61  yte>top ){.defra
ac90: 67 6d 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20  gment_page:.    
aca0: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
acb0: 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
acc0: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
acd0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
ace0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
acf0: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
ad00: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
ad10: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
ad20: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
ad30: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
ad40: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
ad50: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
ad60: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
ad70: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
ad80: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
ad90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ada0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
adb0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
adc0: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
add0: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
ade0: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
adf0: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
ae00: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
ae10: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
ae20: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
ae30: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
ae40: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
ae50: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
ae60: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
ae70: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
ae80: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
ae90: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
aea0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
aeb0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
aec0: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
aed0: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
aee0: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
aef0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
af00: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
af10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
af20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
af30: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
af40: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
af50: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
af60: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
af70: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
af80: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
af90: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
afa0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
afb0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
afc0: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
afd0: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
afe0: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
aff0: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
b000: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
b010: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
b020: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
b030: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
b040: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
b050: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
b060: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
b070: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
b080: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
b090: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
b0a0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
b0b0: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
b0c0: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
b0d0: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
b0e0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
b0f0: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
b100: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
b110: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
b120: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
b130: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
b140: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
b150: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
b160: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b170: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
b180: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
b190: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
b1a0: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
b1d0: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
b1e0: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
b1f0: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
b200: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
b220: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
b230: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
b240: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
b270: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
b280: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
b290: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
b2c0: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
b2d0: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
b2e0: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
b2f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
b300: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
b310: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
b320: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
b330: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
b340: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
b350: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
b360: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
b370: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
b380: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
b390: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
b3a0: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
b3b0: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
b3c0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
b3d0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
b3e0: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
b3f0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b400: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
b410: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b420: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
b430: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
b450: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
b460: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
b470: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
b480: 20 61 73 73 65 72 74 28 20 69 45 6e 64 20 3c 3d   assert( iEnd <=
b490: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b4a0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
b4b0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b4c0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b4d0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b4e0: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
b4f0: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
b500: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
b510: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
b520: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20  art<=iLast );.. 
b530: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
b540: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
b550: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
b560: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
b570: 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  ete.  ** option 
b580: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
b590: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
b5a0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
b5b0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
b5c0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
b5d0: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
b5e0: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
b5f0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
b600: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
b610: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
b620: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
b630: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
b640: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
b650: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
b660: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
b670: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b680: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
b690: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
b6a0: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
b6b0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
b6c0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
b6d0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
b6e0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
b6f0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
b700: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
b710: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
b720: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
b730: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e  e(&data[iPtr]))>
b740: 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53  0 && iFreeBlk<iS
b750: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
b760: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
b770: 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  4 ) return SQLIT
b780: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b790: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
b7a0: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
b7b0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
b7c0: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
b7d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b7e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
b7f0: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
b800: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
b810: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
b820: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
b830: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
b840: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
b850: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
b860: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
b870: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
b880: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
b890: 61 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42  a pointer iFreeB
b8a0: 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  lk.    **.    **
b8b0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
b8c0: 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64   iFreeBlk should
b8d0: 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   be coalesced on
b8e0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53  to the end of iS
b8f0: 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tart..    */.   
b900: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26   if( iFreeBlk &&
b910: 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c   iEnd+3>=iFreeBl
b920: 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67  k ){.      nFrag
b930: 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45   = iFreeBlk - iE
b940: 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  nd;.      if( iE
b950: 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65  nd>iFreeBlk ) re
b960: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b970: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
b980: 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20  iEnd = iFreeBlk 
b990: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
b9a0: 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20  [iFreeBlk+2]);. 
b9b0: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
b9c0: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
b9d0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
b9e0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
b9f0: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
ba00: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
ba10: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
ba20: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
ba30: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
ba40: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
ba50: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
ba60: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
ba70: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
ba80: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
ba90: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
baa0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
bab0: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
bac0: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
bad0: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
bae0: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
baf0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
bb00: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
bb10: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
bb20: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
bb30: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
bb40: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
bb50: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
bb60: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
bb70: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
bb80: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
bb90: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
bba0: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
bbb0: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
bbc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
bbd0: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
bbe0: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
bbf0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bc00: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
bc10: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
bc20: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
bc30: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
bc40: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
bc50: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
bc60: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
bc70: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
bc80: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
bc90: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
bca0: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
bcb0: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
bcc0: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
bcd0: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
bce0: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
bcf0: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
bd00: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
bd10: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
bd20: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
bd30: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
bd40: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
bd50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
bd60: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
bd70: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
bd80: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
bd90: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
bda0: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
bdb0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
bdc0: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
bdd0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
bde0: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
bdf0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
be00: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
be10: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
be20: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
be30: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
be40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
be50: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
be60: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
be70: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
be80: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
be90: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
bea0: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
beb0: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
bec0: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
bed0: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
bee0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
bef0: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
bf00: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
bf10: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
bf20: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
bf30: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
bf40: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
bf50: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
bf60: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
bf70: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
bf80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
bf90: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
bfa0: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
bfb0: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
bfc0: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
bfd0: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
bfe0: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
bff0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
c000: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
c010: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
c020: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
c030: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
c040: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c050: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
c060: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
c070: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
c080: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
c090: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
c0a0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
c0b0: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
c0c0: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
c0d0: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
c0e0: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
c0f0: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
c100: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
c110: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
c120: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
c130: 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
c140: 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74  t;.  if( flagByt
c150: 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41  e==(PTF_LEAFDATA
c160: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29   | PTF_INTKEY) )
c170: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
c180: 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  Key = 1;.    pPa
c190: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
c1a0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
c1b0: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
c1c0: 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65 61  ad = !pPage->lea
c1d0: 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  f;.    pPage->ma
c1e0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
c1f0: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
c200: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
c210: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
c220: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
c230: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
c240: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
c250: 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ey = 0;.    pPag
c260: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
c270: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  0;.    pPage->no
c280: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
c290: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
c2a0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
c2b0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
c2c0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
c2d0: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
c2e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c300: 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78    }.  pPage->max
c310: 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70  1bytePayload = p
c320: 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  Bt->max1bytePayl
c330: 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
c340: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c350: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
c360: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
c370: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
c380: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
c390: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
c3a0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
c3b0: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
c3c0: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
c3d0: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
c3e0: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
c3f0: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
c400: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
c410: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
c420: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
c430: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
c440: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
c450: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
c460: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
c470: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
c480: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
c490: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
c4a0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
c4b0: 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67  int btreeInitPag
c4c0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
c4d0: 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
c4e0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
c4f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c500: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
c510: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
c520: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
c530: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
c540: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
c550: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c560: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c570: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
c580: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
c590: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c5a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
c5b0: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
c5c0: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
c5d0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
c5e0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
c5f0: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
c600: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
c610: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
c620: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
c630: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
c640: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
c650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
c660: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
c670: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
c680: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
c690: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
c6a0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
c6b0: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
c6c0: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
c6d0: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
c6e0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
c6f0: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
c700: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
c710: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
c720: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
c730: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
c740: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
c750: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
c760: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
c770: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
c780: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
c790: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c7a0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
c7b0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
c7c0: 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
c7d0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c7e0: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
c7f0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20  tent area */.   
c800: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
c810: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c      /* First all
c820: 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66  owable cell or f
c830: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
c840: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
c850: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
c860: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
c870: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
c880: 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20  set */..    pBt 
c890: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
c8a0: 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e     hdr = pPage->
c8b0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64  hdrOffset;.    d
c8c0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
c8d0: 74 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f  ta;.    if( deco
c8e0: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64  deFlags(pPage, d
c8f0: 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75  ata[hdr]) ) retu
c900: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c910: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65  T_BKPT;.    asse
c920: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
c930: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
c940: 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29  ageSize<=65536 )
c950: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73  ;.    pPage->mas
c960: 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
c970: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
c980: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76  ;.    pPage->nOv
c990: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
c9a0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
c9b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
c9c0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
c9d0: 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  set = cellOffset
c9e0: 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a   = hdr + 12 - 4*
c9f0: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
ca00: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
ca10: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
ca20: 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize];.    pPage-
ca30: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
ca40: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
ca50: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
ca60: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
ca70: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67  dr+5]);.    pPag
ca80: 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62  e->nCell = get2b
ca90: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
caa0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
cab0: 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28  ->nCell>MX_CELL(
cac0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
cad0: 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
cae0: 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
caf0: 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
cb00: 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
cb10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
cb20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
cb30: 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
cb40: 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ase( pPage->nCel
cb50: 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  l==MX_CELL(pBt) 
cb60: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c  );..    /* A mal
cb70: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
cb80: 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65  page might cause
cb90: 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74   us to read past
cba0: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
cbb0: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
cbc0: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
cbd0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
cbe0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
cbf0: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
cc00: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
cc10: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
cc20: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
cc30: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
cc40: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
cc50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
cc60: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
cc70: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
cc80: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
cc90: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
cca0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
ccb0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
ccc0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
ccd0: 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69  ze - 4;.#if defi
cce0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
ccf0: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
cd00: 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20  CHECK).    {.   
cd10: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
cd20: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
cd30: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
cd40: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
cd50: 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20     int sz;      
cd60: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
cd70: 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20  a cell */..     
cd80: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
cd90: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
cda0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
cdb0: 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
cdc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63  i++){.        pc
cdd0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
cde0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
cdf0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
ce00: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
ce10: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
ce20: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
ce30: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
ce40: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
ce50: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
ce60: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
ce70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ce80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
ce90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cea0: 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
ceb0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
cec0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
ced0: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
cee0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
cef0: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
cf00: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
cf10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
cf20: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
cf30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cf40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
cf50: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
cf60: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
cf70: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
cf80: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
cf90: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
cfa0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
cfb0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
cfc0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
cfd0: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
cfe0: 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20  r+7] + top;.    
cff0: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
d000: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
d010: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
d020: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
d030: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
d040: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
d050: 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69   of free block i
d060: 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a  s off the page *
d070: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
d080: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d090: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
d0a0: 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32       next = get2
d0b0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
d0c0: 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65  .      size = ge
d0d0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
d0e0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  2]);.      if( (
d0f0: 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d  next>0 && next<=
d100: 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63  pc+size+3) || pc
d110: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
d120: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   ){.        /* F
d130: 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20  ree blocks must 
d140: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
d150: 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c  order. And the l
d160: 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20  ast byte of.    
d170: 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d      ** the free-
d180: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
d190: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
d1a0: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
d1b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d1c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
d1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
d1e0: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
d1f0: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
d200: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
d210: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
d220: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
d230: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
d240: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
d250: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
d260: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
d270: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
d280: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
d290: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
d2a0: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
d2b0: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
d2c0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
d2d0: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
d2e0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
d2f0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
d300: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
d310: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
d320: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
d330: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
d340: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
d350: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
d360: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
d370: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
d380: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
d390: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
d3a0: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
d3b0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
d3c0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
d3d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d3e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
d3f0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
d400: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
d410: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
d420: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
d430: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
d440: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
d450: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
d460: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
d470: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
d480: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
d490: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
d4a0: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
d4b0: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
d4c0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d4d0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
d4e0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
d4f0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
d500: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
d510: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
d520: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
d530: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d540: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
d550: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d560: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
d570: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d580: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
d590: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d5a0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d5b0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d5c0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
d5d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d5e0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
d5f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d600: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
d610: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
d620: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
d630: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
d640: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d650: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
d660: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
d670: 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
d680: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
d690: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
d6a0: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
d6b0: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
d6c0: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
d6d0: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
d6e0: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
d6f0: 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73   = hdr + ((flags
d700: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20  &PTF_LEAF)==0 ? 
d710: 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65  12 : 8);.  memse
d720: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
d730: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
d740: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
d750: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d760: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
d770: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
d780: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
d790: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
d7a0: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
d7b0: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
d7c0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  );.  pPage->cell
d7d0: 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
d7e0: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
d7f0: 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75  d = &data[pBt->u
d800: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
d810: 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
d820: 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20  &data[first];.  
d830: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
d840: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
d850: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
d860: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
d870: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
d880: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
d890: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
d8a0: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50  eSize - 1);.  pP
d8b0: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
d8c0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
d8d0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  = 1;.}.../*.** C
d8e0: 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20  onvert a DbPage 
d8f0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68  obtained from th
d900: 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d  e pager into a M
d910: 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a  emPage used by.*
d920: 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  * the btree laye
d930: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  r..*/.static Mem
d940: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46  Page *btreePageF
d950: 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65  romDbPage(DbPage
d960: 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20   *pDbPage, Pgno 
d970: 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a  pgno, BtShared *
d980: 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
d990: 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67  *pPage = (MemPag
d9a0: 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47  e*)sqlite3PagerG
d9b0: 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
d9c0: 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
d9d0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
d9e0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
d9f0: 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  .  pPage->pDbPag
da00: 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70  e = pDbPage;.  p
da10: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
da20: 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d  .  pPage->pgno =
da30: 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e   pgno;.  pPage->
da40: 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67  hdrOffset = pPag
da50: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
da60: 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   : 0;.  return p
da70: 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
da80: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
da90: 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
daa0: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
dab0: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
dac0: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
dad0: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
dae0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43  **.** If the noC
daf0: 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73  ontent flag is s
db00: 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  et, it means tha
db10: 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
db20: 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f   about.** the co
db30: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
db40: 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20  e at this time. 
db50: 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f   So do not go to
db60: 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20   the disk.** to 
db70: 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e  fetch the conten
db80: 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e  t.  Just fill in
db90: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74   the content wit
dba0: 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e  h zeros for now.
dbb0: 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75  .** If in the fu
dbc0: 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c  ture we call sql
dbd0: 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
dbe0: 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74   on this page, t
dbf0: 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20  hat.** means we 
dc00: 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20  have started to 
dc10: 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f  be concerned abo
dc20: 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74  ut content and t
dc30: 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20  he disk.** read 
dc40: 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
dc50: 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
dc60: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
dc70: 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  etPage(.  BtShar
dc80: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
dc90: 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
dca0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
dcb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dcc0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
dcd0: 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
dce0: 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
dcf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
dd00: 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
dd10: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
dd20: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
dd30: 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
dd40: 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
dd50: 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
dd60: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
dd70: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
dd80: 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
dd90: 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  0 || flags==PAGE
dda0: 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
ddb0: 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
ddc0: 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a  GET_READONLY );.
ddd0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
dde0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
ddf0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
de00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
de10: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
de20: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
de30: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
de40: 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
de50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
de60: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
de70: 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
de80: 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
de90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dea0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
deb0: 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
dec0: 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
ded0: 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
dee0: 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
def0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
df00: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
df10: 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
df20: 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
df30: 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
df40: 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
df50: 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
df60: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
df70: 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
df80: 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
df90: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
dfa0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
dfb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
dfc0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
dfd0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
dfe0: 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
dff0: 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
e000: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
e010: 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
e020: 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
e030: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
e040: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
e050: 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
e060: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
e070: 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
e080: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e090: 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
e0a0: 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
e0b0: 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
e0c0: 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
e0d0: 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
e0e0: 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
e0f0: 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
e100: 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
e110: 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
e120: 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
e130: 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
e140: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
e150: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
e160: 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
e170: 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
e180: 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
e190: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  =0 );.  return b
e1a0: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
e1b0: 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
e1c0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
e1d0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
e1e0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
e1f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75  is routine is ju
e200: 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69 65  st a.** convenie
e210: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
e220: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
e230: 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67  s to btreeGetPag
e240: 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72 65  e() and .** btre
e250: 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
e260: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
e270: 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
e280: 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69 73  value *ppPage is
e290: 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65 66   set to is undef
e2a0: 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20  ined. It.** may 
e2b0: 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64  remain unchanged
e2c0: 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73  , or it may be s
e2d0: 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  et to an invalid
e2e0: 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
e2f0: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
e300: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
e310: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
e320: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
e330: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
e340: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
e370: 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a  he page to get *
e380: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
e390: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
e3a0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
e3b0: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
e3c0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61  re */.  int bRea
e3d0: 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20  donly           
e3e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
e3f0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f 72  _GET_READONLY or
e400: 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72   0 */.){.  int r
e410: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
e420: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e430: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e440: 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f 6e   assert( bReadon
e450: 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45  ly==PAGER_GET_RE
e460: 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64 6f  ADONLY || bReado
e470: 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  nly==0 );..  if(
e480: 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
e490: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
e4a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
e4b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
e4c0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
e4d0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
e4e0: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52 65  gno, ppPage, bRe
e4f0: 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66 28  adonly);.    if(
e500: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e510: 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  & (*ppPage)->isI
e520: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
e530: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
e540: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
e550: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
e560: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
e570: 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
e580: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
e590: 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63    }.  }..  testc
e5a0: 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
e5b0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
e5c0: 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
e5d0: 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
e5e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e5f0: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
e600: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
e610: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
e620: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
e630: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
e640: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
e650: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
e660: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
e670: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
e680: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e690: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
e6a0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e6b0: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
e6c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
e6d0: 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  age!=0 );.    as
e6e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e6f0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
e700: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
e710: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
e720: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e730: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
e740: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
e750: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
e760: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
e770: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
e780: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
e790: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
e7a0: 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c  agerUnrefNotNull
e7b0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e7c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
e7d0: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
e7e0: 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  , when the pager
e7f0: 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61   reloads informa
e800: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61  tion into the ca
e810: 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74  che.** so that t
e820: 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74  he cache is rest
e830: 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67  ored to its orig
e840: 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68  inal state at th
e850: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
e860: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66  e transaction, f
e870: 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73  or each page res
e880: 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69  tored this routi
e890: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
e8a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e8b0: 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20   needs to reset 
e8c0: 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73  the extra data s
e8d0: 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e  ection at the en
e8e0: 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65  d of the.** page
e8f0: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
e900: 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61  he restored data
e910: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e920: 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61   pageReinit(DbPa
e930: 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65  ge *pData){.  Me
e940: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
e950: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
e960: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
e970: 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a  etExtra(pData);.
e980: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e990: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
e9a0: 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20  nt(pData)>0 );. 
e9b0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
e9c0: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
e9d0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e9e0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e9f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
ea00: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
ea10: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
ea20: 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
ea30: 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20  nt(pData)>1 ){. 
ea40: 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69       /* pPage mi
ea50: 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72  ght not be a btr
ea60: 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67  ee page;  it mig
ea70: 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ht be an overflo
ea80: 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
ea90: 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f  or ptrmap page o
eaa0: 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20  r a free page.  
eab0: 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20  In those cases, 
eac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
ead0: 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62      ** call to b
eae0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 77  treeInitPage() w
eaf0: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75 72  ill likely retur
eb00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
eb10: 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e  ..      ** But n
eb20: 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20 62  o harm is done b
eb30: 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74 20  y this.  And it 
eb40: 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61 6e  is very importan
eb50: 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  t that.      ** 
eb60: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
eb70: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65  be called on eve
eb80: 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f  ry btree page so
eb90: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a   we make.      *
eba0: 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65  * the call for e
ebb0: 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63  very page that c
ebc0: 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69  omes in for re-i
ebd0: 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20  niting. */.     
ebe0: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
ebf0: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
ec00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
ec10: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
ec20: 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a  r for a btree..*
ec30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
ec40: 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
ec50: 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b  ler(void *pArg){
ec60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ec70: 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41   = (BtShared*)pA
ec80: 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  rg;.  assert( pB
ec90: 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72  t->db );.  asser
eca0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ecb0: 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d  _held(pBt->db->m
ecc0: 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72  utex) );.  retur
ecd0: 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  n sqlite3InvokeB
ece0: 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d  usyHandler(&pBt-
ecf0: 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72  >db->busyHandler
ed00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
ed10: 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
ed20: 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61  ..** .** zFilena
ed30: 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  me is the name o
ed40: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
ed50: 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61  ile.  If zFilena
ed60: 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68  me is NULL.** th
ed70: 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  en an ephemeral 
ed80: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
ed90: 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d 65  ted.  The epheme
eda0: 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69 67  ral database mig
edb0: 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73 69  ht.** be exclusi
edc0: 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20  vely in memory, 
edd0: 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65 20  or it might use 
ede0: 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d  a disk-based mem
edf0: 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69  ory cache..** Ei
ee00: 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65 70  ther way, the ep
ee10: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
ee20: 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
ee30: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a  ically deleted .
ee40: 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ** when sqlite3B
ee50: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
ee60: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  alled..**.** If 
ee70: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
ee80: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
ee90: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
eea0: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
eeb0: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
eec0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
eed0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
eee0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66  ed..**.** The "f
eef0: 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72 20  lags" parameter 
ef00: 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68 61  is a bitmask tha
ef10: 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20  t might contain 
ef20: 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52  bits like.** BTR
ef30: 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20  EE_OMIT_JOURNAL 
ef40: 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d  and/or BTREE_MEM
ef50: 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ORY..**.** If th
ef60: 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
ef70: 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20  ready opened in 
ef80: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
ef90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
efa0: 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68  and we are in sh
efb0: 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c  ared cache mode,
efc0: 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77   then the open w
efd0: 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e  ill fail with an
efe0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  .** SQLITE_CONST
eff0: 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65  RAINT error.  We
f000: 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77   cannot allow tw
f010: 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72  o or more BtShar
f020: 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  ed.** objects in
f030: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
f040: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69  se connection si
f050: 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c  nce doing so wil
f060: 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f  l lead.** to pro
f070: 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69  blems with locki
f080: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
f090: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73  e3BtreeOpen(.  s
f0a0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
f0b0: 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f  ,      /* VFS to
f0c0: 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d   use for this b-
f0d0: 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tree */.  const 
f0e0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
f0f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
f100: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
f110: 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62   the BTree datab
f120: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
f130: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
f140: 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64   /* Associated d
f150: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
f160: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
f170: 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ree,        /* P
f180: 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74  ointer to new Bt
f190: 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74  ree object writt
f1a0: 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  en here */.  int
f1b0: 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
f1c0: 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20       /* Options 
f1d0: 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
f1e0: 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
f1f0: 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  Flags passed thr
f200: 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
f210: 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29  vfs.xOpen() */.)
f220: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
f230: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
f240: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72     /* Shared par
f250: 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75 63  t of btree struc
f260: 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ture */.  Btree 
f270: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
f280: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
f290: 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  le to return */.
f2a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
f2b0: 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20  *mutexOpen = 0; 
f2c0: 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72   /* Prevents a r
f2d0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54  ace condition. T
f2e0: 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20  icket #3537 */. 
f2f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f300: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
f310: 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
f320: 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
f330: 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72  n */.  u8 nReser
f340: 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ve;             
f350: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
f360: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e   unused space on
f370: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
f380: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44  unsigned char zD
f390: 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f  bHeader[100];  /
f3a0: 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
f3b0: 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  r content */..  
f3c0: 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69  /* True if openi
f3d0: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c  ng an ephemeral,
f3e0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
f3f0: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  ase */.  const i
f400: 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46  nt isTempDb = zF
f410: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
f420: 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a  ilename[0]==0;..
f430: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72    /* Set the var
f440: 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f  iable isMemdb to
f450: 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d   true for an in-
f460: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
f470: 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20   or .  ** false 
f480: 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64  for a file-based
f490: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
f4a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
f4b0: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f  IT_MEMORYDB.  co
f4c0: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
f4d0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  = 0;.#else.  con
f4e0: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
f4f0: 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73   (zFilename && s
f500: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
f510: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29   ":memory:")==0)
f520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f530: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65          || (isTe
f540: 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33 54  mpDb && sqlite3T
f550: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29  empInMemory(db))
f560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f570: 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73 46          || (vfsF
f580: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
f590: 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23  EN_MEMORY)!=0;.#
f5a0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
f5b0: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
f5c0: 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a 20  rt( pVfs!=0 );. 
f5d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f5e0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
f5f0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
f600: 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66 29  rt( (flags&0xff)
f610: 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20  ==flags );   /* 
f620: 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20 62  flags fit in 8 b
f630: 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c  its */..  /* Onl
f640: 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  y a BTREE_SINGLE
f650: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
f660: 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
f670: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
f680: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e 4f  lags & BTREE_UNO
f690: 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66  RDERED)==0 || (f
f6a0: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
f6b0: 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  GLE)!=0 );..  /*
f6c0: 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20   A BTREE_SINGLE 
f6d0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77 61  database is alwa
f6e0: 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 61  ys a temporary a
f6f0: 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c 20  nd/or ephemeral 
f700: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  */.  assert( (fl
f710: 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47  ags & BTREE_SING
f720: 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  LE)==0 || isTemp
f730: 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d  Db );..  if( isM
f740: 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61 67  emdb ){.    flag
f750: 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52  s |= BTREE_MEMOR
f760: 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76 66  Y;.  }.  if( (vf
f770: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
f780: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30  OPEN_MAIN_DB)!=0
f790: 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20   && (isMemdb || 
f7a0: 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20 20  isTempDb) ){.   
f7b0: 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66 73   vfsFlags = (vfs
f7c0: 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45 5f  Flags & ~SQLITE_
f7d0: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20  OPEN_MAIN_DB) | 
f7e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
f7f0: 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73  _DB;.  }.  p = s
f800: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
f810: 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b  (sizeof(Btree));
f820: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
f830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f840: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  OMEM;.  }.  p->i
f850: 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
f860: 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
f870: 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
f880: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
f890: 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
f8a0: 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
f8b0: 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
f8c0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
f8d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
f8e0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
f8f0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
f900: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
f910: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
f920: 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
f930: 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
f940: 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
f950: 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
f960: 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
f970: 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
f980: 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
f990: 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
f9a0: 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
f9b0: 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
f9c0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
f9d0: 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
f9e0: 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
f9f0: 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
fa00: 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
fa10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
fa20: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
fa30: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
fa40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
fa50: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
fa60: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
fa70: 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
fa80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
fa90: 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20  utexShared; ).  
faa0: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
fab0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21  = 1;.      if( !
fac0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
fad0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
fae0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
faf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
fb10: 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
fb20: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
fb30: 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
fb40: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c  , zFilename, sql
fb50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
fb60: 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20 20  lename)+1);.    
fb70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
fb80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
fb90: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
fba0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
fbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
fbe0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
fbf0: 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
fc00: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
fc10: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
fc20: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
fc30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
fc40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
fc50: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
fc60: 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
fc70: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
fc80: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
fc90: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
fca0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
fcb0: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
fcc0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
fcd0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
fce0: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
fcf0: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
fd00: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fd10: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
fd20: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
fd30: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
fd40: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
fd50: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
fd60: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
fd70: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fd80: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
fd90: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
fda0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
fdb0: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
fdc0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
fdd0: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
fde0: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
fdf0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
fe00: 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe20: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
fe30: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
fe40: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
fe50: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
fe60: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
fe70: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
fe80: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
fe90: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
fea0: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
feb0: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
fec0: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
fed0: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
fee0: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ff00: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ff10: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
ff20: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
ff30: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ff40: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
ff50: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ff60: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
ff70: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
ff80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ff90: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
ffa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ffb0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
ffc0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ffd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ffe0: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
fff0: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
10000 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
10010 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
10020 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
10030 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10040 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
10050 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10060 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
10070 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
10080 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
10090 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
100a0 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
100b0 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
100c0 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
100d0 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
100e0 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
100f0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
10100 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
10110 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
10120 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
10130 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
10140 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
10150 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10160 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
10170 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
10180 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
10190 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
101a0 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
101b0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
101c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
101d0 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
101e0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
101f0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
10200 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
10210 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
10220 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
10230 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
10240 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
10250 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
10260 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
10270 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
10280 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
10290 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
102a0 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
102b0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
102c0 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
102d0 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
102e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
102f0 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
10300 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
10310 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10320 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
10330 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
10340 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
10350 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
10360 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
10370 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
10380 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
10390 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
103a0 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
103b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
103c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
103d0 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
103e0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
103f0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10400 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
10410 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
10420 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
10430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
10440 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
10450 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52   vfsFlags, pageR
10460 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20  einit);.    if( 
10470 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
10490 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  gerSetMmapLimit(
104a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d  pBt->pPager, db-
104b0 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20  >szMmap);.      
104c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
104d0 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28  rReadFileheader(
104e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65  pBt->pPager,size
104f0 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44  of(zDbHeader),zD
10500 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a  bHeader);.    }.
10510 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10520 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
10530 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
10540 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ut;.    }.    pB
10550 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28  t->openFlags = (
10560 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42  u8)flags;.    pB
10570 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  t->db = db;.    
10580 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
10590 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e  usyhandler(pBt->
105a0 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76  pPager, btreeInv
105b0 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20  okeBusyHandler, 
105c0 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74  pBt);.    p->pBt
105d0 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70   = pBt;.  .    p
105e0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b  Bt->pCursor = 0;
105f0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
10600 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
10610 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
10620 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72  only(pBt->pPager
10630 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ) ) pBt->btsFlag
10640 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
10650 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  LY;.#ifdef SQLIT
10660 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
10670 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
10680 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
10690 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20  DELETE;.#endif. 
106a0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
106b0 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
106c0 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
106d0 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
106e0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
106f0 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
10700 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
10710 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
10720 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
10730 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
10740 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
10750 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
10760 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
10770 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10780 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
10790 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
107a0 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
107b0 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
107c0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
107d0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
107e0 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
107f0 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
10800 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
10810 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
10820 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
10830 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
10840 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
10850 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
10860 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
10870 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
10880 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
10890 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
108a0 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
108b0 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
108c0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
108d0 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
108e0 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
108f0 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
10900 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
10910 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
10920 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
10930 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
10940 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
10950 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
10960 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
10970 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
10980 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
10990 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
109a0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
109b0 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
109c0 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
109d0 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72  se{.      nReser
109e0 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
109f0 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
10a00 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
10a10 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
10a20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10a30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
10a40 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
10a50 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
10a60 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
10a70 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
10a80 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
10a90 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
10aa0 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
10ab0 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
10ac0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10ad0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10ae0 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
10af0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
10b00 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
10b10 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
10b20 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
10b30 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
10b40 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
10b50 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
10b60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
10b70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
10b80 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
10b90 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
10ba0 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
10bb0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
10bc0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10bd0 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
10be0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
10bf0 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
10c00 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
10c10 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
10c20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
10c30 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
10c40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10c50 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
10c60 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
10c70 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
10c80 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a  *mutexShared; ).
10c90 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
10ca0 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  = 1;.      MUTEX
10cb0 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
10cc0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
10cd0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
10ce0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
10cf0 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
10d00 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
10d10 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
10d20 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
10d30 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
10d40 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
10d50 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
10d60 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
10d70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
10d80 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
10d90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10da0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
10db0 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
10dc0 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
10dd0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
10de0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
10df0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10e00 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10e10 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
10e20 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
10e30 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
10e40 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
10e50 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
10e60 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
10e70 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
10e80 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
10e90 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
10ea0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10eb0 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
10ec0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
10ed0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10ee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10ef0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
10f00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
10f10 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
10f20 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
10f30 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
10f40 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
10f50 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
10f60 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
10f70 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
10f80 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
10f90 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
10fa0 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
10fb0 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
10fc0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
10fd0 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
10fe0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
10ff0 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
11000 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
11010 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
11020 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11030 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
11040 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
11050 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
11060 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
11070 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
11080 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
11090 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
110a0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
110b0 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
110c0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
110d0 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
110e0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
110f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
11100 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
11110 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11120 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
11130 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
11140 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
11150 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
11160 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
11170 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
11180 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
11190 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
111a0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
111b0 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
111c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
111d0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
111e0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
111f0 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
11200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11210 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
11220 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
11230 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11240 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
11250 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
11260 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
11270 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
11280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11290 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
112a0 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
112b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
112c0 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
112d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
112e0 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
112f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11300 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
11310 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
11320 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72    /* If the B-Tr
11330 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ee was successfu
11340 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20  lly opened, set 
11350 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
11360 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20  size to the.    
11370 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  ** default value
11380 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f  . Except, when o
11390 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69  pening on an exi
113a0 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67  sting shared pag
113b0 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a  er-cache,.    **
113c0 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
113d0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
113e0 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
113f0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
11400 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d  Schema(p, 0, 0)=
11410 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
11420 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
11430 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  size(p->pBt->pPa
11440 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41  ger, SQLITE_DEFA
11450 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b  ULT_CACHE_SIZE);
11460 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
11470 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20   mutexOpen ){.  
11480 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11490 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74  3_mutex_held(mut
114a0 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73  exOpen) );.    s
114b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
114c0 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
114d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
114e0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
114f0 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
11500 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
11510 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
11520 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
11530 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
11540 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
11550 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
11560 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
11570 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
11580 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
11590 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
115a0 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
115b0 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
115c0 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
115d0 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
115e0 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
115f0 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
11600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
11610 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58  ED_CACHE.  MUTEX
11620 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
11630 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20  mutex *pMaster; 
11640 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c  ).  BtShared *pL
11650 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76  ist;.  int remov
11660 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ed = 0;..  asser
11670 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11680 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75  _notheld(pBt->mu
11690 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f  tex) );.  MUTEX_
116a0 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
116b0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
116c0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
116d0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
116e0 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
116f0 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
11700 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
11710 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
11720 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
11730 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
11740 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
11750 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
11760 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
11770 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
11780 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
11790 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
117a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
117b0 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
117c0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
117d0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
117e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
117f0 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
11800 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
11810 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
11820 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
11830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
11840 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
11850 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
11860 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
11870 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
11880 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
11890 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
118a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
118b0 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
118c0 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
118d0 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
118e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
118f0 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
11900 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
11910 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
11920 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
11930 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
11940 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
11950 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
11960 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
11970 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
11980 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
11990 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
119a0 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
119b0 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
119c0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
119d0 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
119e0 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
119f0 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
11a00 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  eSize );..    /*
11a10 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73   One of the uses
11a20 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61   of pBt->pTmpSpa
11a30 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20  ce is to format 
11a40 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20  cells before.   
11a50 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68   ** inserting th
11a60 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70  em into a leaf p
11a70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69  age (function fi
11a80 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a  llInCell()). If.
11a90 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73      ** a cell is
11aa0 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74   less than 4 byt
11ab0 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69  es in size, it i
11ac0 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  s rounded up to 
11ad0 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62  4 bytes.    ** b
11ae0 79 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f  y the various ro
11af0 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69  utines that mani
11b00 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65  pulate binary ce
11b10 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a  lls. Which.    *
11b20 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20  * can mean that 
11b30 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c  fillInCell() onl
11b40 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68  y initializes th
11b50 65 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20  e first 2 or 3. 
11b60 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
11b70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68  TmpSpace, but th
11b80 61 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62  at the first 4 b
11b90 79 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20  ytes are copied 
11ba0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69  from.    ** it i
11bb0 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70  nto a database p
11bc0 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  age. This is not
11bd0 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62   actually a prob
11be0 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20  lem, but it.    
11bf0 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20  ** does cause a 
11c00 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77  valgrind error w
11c10 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62  hen the 1 or 2 b
11c20 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69  ytes of unitiali
11c30 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61  zed .    ** data
11c40 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79   is passed to sy
11c50 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28  stem call write(
11c60 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74  ). So to avoid t
11c70 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a  his error,.    *
11c80 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74  * zero the first
11c90 20 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70   4 bytes of temp
11ca0 20 73 70 61 63 65 20 68 65 72 65 2e 20 20 2a 2f   space here.  */
11cb0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
11cc0 6d 70 53 70 61 63 65 20 29 20 6d 65 6d 73 65 74  mpSpace ) memset
11cd0 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
11ce0 20 30 2c 20 34 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f   0, 4);.  }.}../
11cf0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
11d00 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
11d10 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
11d20 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
11d30 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
11d40 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
11d50 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
11d60 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
11d70 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
11d80 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
11d90 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
11da0 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
11db0 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
11dc0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
11dd0 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
11de0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11df0 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
11e00 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
11e10 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
11e20 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
11e30 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
11e40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11e50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
11e60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
11e70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
11e80 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
11e90 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
11ea0 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
11eb0 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
11ec0 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
11ed0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
11ee0 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
11ef0 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
11f00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
11f10 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
11f20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11f30 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
11f40 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
11f50 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
11f60 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
11f70 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
11f80 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
11f90 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
11fa0 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
11fb0 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
11fc0 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
11fd0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
11fe0 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  ck(p, SQLITE_OK)
11ff0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12000 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
12010 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
12020 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
12030 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
12040 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
12050 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
12060 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
12070 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
12080 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
12090 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
120a0 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
120b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
120c0 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
120d0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
120e0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
120f0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
12100 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
12110 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
12120 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
12130 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
12140 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
12150 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
12160 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
12170 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
12180 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
12190 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
121a0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
121b0 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
121c0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
121d0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
121e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
121f0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
12200 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
12210 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
12220 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
12230 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
12240 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
12250 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
12260 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
12270 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
12280 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
12290 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
122a0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
122b0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
122c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
122d0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
122e0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
122f0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12300 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
12310 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
12320 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
12330 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
12340 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
12350 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
12360 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
12370 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
12380 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
12390 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
123a0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
123b0 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
123c0 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
123d0 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
123e0 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
123f0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
12400 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
12410 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
12420 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
12430 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
12440 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
12450 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
12460 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
12470 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
12480 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
12490 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
124a0 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
124b0 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
124c0 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
124d0 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
124e0 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
124f0 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
12500 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
12510 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
12520 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
12530 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
12540 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
12550 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
12560 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
12570 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
12580 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
12590 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
125a0 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
125b0 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
125c0 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
125d0 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
125e0 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
125f0 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
12600 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
12610 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
12620 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
12630 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
12640 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
12650 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
12660 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
12670 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
12680 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
12690 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
126a0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
126b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
126c0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
126d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
126e0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
126f0 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
12700 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
12710 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
12720 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12730 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12740 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
12750 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
12760 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ZE>0./*.** Chang
12770 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
12780 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
12790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
127a0 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65  hat may be.** me
127b0 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a  mory mapped..*/.
127c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
127d0 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72  SetMmapLimit(Btr
127e0 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69  ee *p, sqlite3_i
127f0 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20  nt64 szMmap){.  
12800 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12810 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
12820 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
12830 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
12840 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
12850 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12860 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
12870 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
12880 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20  ager, szMmap);. 
12890 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
128a0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
128b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
128c0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41  dif /* SQLITE_MA
128d0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
128e0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
128f0 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73  he way data is s
12900 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e  ynced to disk in
12910 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61   order to increa
12920 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a  se or decrease.*
12930 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64  * how well the d
12940 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20  atabase resists 
12950 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53  damage due to OS
12960 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77   crashes and pow
12970 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20  er.** failures. 
12980 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20   Level 1 is the 
12990 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f  same as asynchro
129a0 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29  nous (no syncs()
129b0 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68   occur and.** th
129c0 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72  ere is a high pr
129d0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
129e0 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73  age)  Level 2 is
129f0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54   the default.  T
12a00 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72  here.** is a ver
12a10 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65  y low but non-ze
12a20 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ro probability o
12a30 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c  f damage.  Level
12a40 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a   3 reduces the.*
12a50 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  * probability of
12a60 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20   damage to near 
12a70 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20  zero but with a 
12a80 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63  write performanc
12a90 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  e reduction..*/.
12aa0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12ab0 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
12ac0 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  S.int sqlite3Btr
12ad0 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28  eeSetPagerFlags(
12ae0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
12af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12b00 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68   btree to set th
12b10 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f  e safety level o
12b20 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  n */.  unsigned 
12b30 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a  pgFlags       /*
12b40 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a   Various PAGER_*
12b50 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42   flags */.){.  B
12b60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
12b70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
12b80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12b90 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
12ba0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
12bb0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
12bc0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c  qlite3PagerSetFl
12bd0 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ags(pBt->pPager,
12be0 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c   pgFlags);.  sql
12bf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12c10 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
12c20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
12c30 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
12c40 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
12c50 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
12c60 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
12c70 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
12c80 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
12c90 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
12ca0 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
12cb0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
12cc0 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
12cd0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
12ce0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
12cf0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
12d00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12d10 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
12d20 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
12d30 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12d40 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
12d50 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
12d60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12d70 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
12d80 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
12d90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12db0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
12dc0 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
12dd0 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
12de0 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
12df0 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
12e00 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
12e10 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
12e20 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
12e30 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
12e40 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
12e50 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
12e60 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
12e70 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
12e80 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
12e90 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
12ea0 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
12eb0 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
12ec0 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
12ed0 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
12ee0 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
12ef0 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
12f00 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
12f10 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
12f20 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
12f30 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
12f40 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
12f50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12f60 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
12f70 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
12f80 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
12f90 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
12fa0 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
12fb0 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
12fc0 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
12fd0 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
12fe0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
12ff0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
13000 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
13010 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
13020 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
13030 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
13040 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
13050 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
13060 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
13070 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
13080 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45  the BTS_PAGESIZE
13090 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20 73  _FIXED flag is s
130a0 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  et so that the p
130b0 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20  age size.** and 
130c0 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20  autovacuum mode 
130d0 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65  can no longer be
130e0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74   changed..*/.int
130f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13100 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a  PageSize(Btree *
13110 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c  p, int pageSize,
13120 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69   int nReserve, i
13130 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20  nt iFix){.  int 
13140 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13150 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13160 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
13170 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31  rt( nReserve>=-1
13180 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
13190 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
131a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
131b0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
131c0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
131d0 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
131e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
131f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13200 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
13210 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
13220 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
13230 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
13240 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
13250 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
13260 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
13270 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
13280 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
13290 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
132a0 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
132b0 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
132c0 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
132d0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
132e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
132f0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
13300 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
13310 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26   !pBt->pPage1 &&
13320 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
13330 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
13340 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
13350 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
13360 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
13370 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
13380 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
13390 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
133a0 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
133b0 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
133c0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
133d0 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
133e0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
133f0 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
13400 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
13410 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
13420 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
13430 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
13440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
13450 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
13460 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
13470 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
13480 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
13490 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
134a0 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
134b0 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eSize;.}..#if de
134c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 53  fined(SQLITE_HAS
134d0 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65 66 69 6e  _CODEC) || defin
134e0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
134f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
13500 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
13510 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
13520 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
13530 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
13540 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
13550 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
13560 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
13570 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
13580 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
13590 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
135a0 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
135b0 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
135c0 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
135d0 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
135e0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
135f0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
13600 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
13610 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
13620 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
13630 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
13640 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
13650 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
13660 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
13670 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
13680 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
13690 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
136a0 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
136b0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
136c0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
136d0 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
136e0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
136f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13700 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
13710 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
13720 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
13730 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13740 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
13750 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
13760 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
13770 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
13780 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
13790 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 20 7c 7c  ITE_HAS_CODEC ||
137a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
137b0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
137c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
137d0 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
137e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
137f0 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
13800 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
13810 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
13820 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
13830 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
13840 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
13850 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
13860 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
13870 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
13880 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
13890 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
138a0 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  ensions..*/.int 
138b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
138c0 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29  eserve(Btree *p)
138d0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
138e0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
138f0 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
13900 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
13910 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
13920 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13930 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13940 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   n;.}../*.** Set
13950 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
13960 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
13970 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
13980 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
13990 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
139a0 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
139b0 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
139c0 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
139d0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
139e0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
139f0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
13a00 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
13a10 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
13a20 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
13a30 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
13a40 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
13a50 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13a60 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
13a70 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
13a80 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
13a90 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
13aa0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13ab0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
13ac0 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53  ** Set the BTS_S
13ad0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61  ECURE_DELETE fla
13ae0 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  g if newFlag is 
13af0 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46  0 or 1.  If newF
13b00 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68  lag is -1,.** th
13b10 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  en make no chang
13b20 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  es.  Always retu
13b30 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
13b40 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
13b50 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67  ELETE.** setting
13b60 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
13b70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
13b80 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
13b90 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
13ba0 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
13bb0 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
13bc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
13bd0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13be0 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
13bf0 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
13c00 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
13c10 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
13c20 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c  E;.    if( newFl
13c30 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73  ag ) p->pBt->bts
13c40 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
13c50 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20  URE_DELETE;.  } 
13c60 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
13c70 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
13c80 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30  ECURE_DELETE)!=0
13c90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13ca0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13cb0 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn b;.}.#endif /
13cc0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
13cd0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
13ce0 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
13cf0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
13d00 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
13d10 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
13d20 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
13d30 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
13d40 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
13d50 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
13d60 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
13d70 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
13d80 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
13d90 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
13da0 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
13db0 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
13dc0 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
13dd0 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
13de0 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
13df0 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
13e00 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
13e10 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
13e20 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
13e30 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
13e40 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
13e50 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
13e60 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13e70 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
13e80 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
13e90 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
13ea0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
13eb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13ec0 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29  ;.  u8 av = (u8)
13ed0 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73  autoVacuum;..  s
13ee0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13ef0 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d  (p);.  if( (pBt-
13f00 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
13f10 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21  PAGESIZE_FIXED)!
13f20 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21  =0 && (av ?1:0)!
13f30 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  =pBt->autoVacuum
13f40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13f50 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
13f60 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e  }else{.    pBt->
13f70 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20  autoVacuum = av 
13f80 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69  ?1:0;.    pBt->i
13f90 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d  ncrVacuum = av==
13fa0 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71  2 ?1:0;.  }.  sq
13fb0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
13fc0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
13fd0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
13fe0 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
13ff0 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
14000 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
14010 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
14020 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
14030 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
14040 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
14050 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
14060 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
14070 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
14080 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14090 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
140a0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
140b0 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
140c0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
140d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
140e0 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
140f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
14100 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
14110 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
14120 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
14130 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
14140 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
14150 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
14160 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
14170 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14180 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
14190 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
141a0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
141b0 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
141c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
141d0 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
141e0 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
141f0 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
14200 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
14210 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
14220 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
14230 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
14240 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
14250 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
14260 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
14270 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
14280 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
14290 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
142a0 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
142b0 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
142c0 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
142d0 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
142e0 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
142f0 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
14300 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
14310 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
14320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
14330 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  ult code from su
14340 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  bfunctions */.  
14350 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
14360 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f       /* Page 1 o
14370 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
14380 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
14390 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
143a0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
143b0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
143c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46   */.  int nPageF
143d0 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  ile = 0;   /* Nu
143e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
143f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14400 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
14410 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20  eHeader;     /* 
14420 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
14430 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
14440 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72  according to hdr
14450 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
14460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14470 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
14480 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
14490 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72  pPage1==0 );.  r
144a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
144b0 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e  SharedLock(pBt->
144c0 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
144d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
144e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d  eturn rc;.  rc =
144f0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
14500 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
14510 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
14520 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
14530 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
14540 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
14550 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
14560 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
14570 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
14580 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
14590 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65  e. .  */.  nPage
145a0 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d   = nPageHeader =
145b0 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
145c0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
145d0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
145e0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
145f0 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c  Pager, &nPageFil
14600 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d  e);.  if( nPage=
14610 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b  =0 || memcmp(24+
14620 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
14630 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67  ta, 92+(u8*)pPag
14640 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20  e1->aData,4)!=0 
14650 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  ){.    nPage = n
14660 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20  PageFile;.  }.  
14670 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
14680 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
14690 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
146a0 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
146b0 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
146c0 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
146d0 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
146e0 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
146f0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
14700 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
14710 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
14720 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
14730 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
14740 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
14750 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
14760 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14770 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
14780 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
14790 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
147a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
147b0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
147c0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
147d0 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
147e0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
147f0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
14800 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
14810 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
14820 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
14830 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
14840 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14850 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
14860 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
14870 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
14880 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
14890 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
148a0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
148b0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
148c0 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
148d0 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
148e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
148f0 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
14900 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
14910 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
14920 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
14930 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
14940 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
14950 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
14960 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
14970 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
14980 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
14990 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
149a0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
149b0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
149c0 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
149d0 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
149e0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
149f0 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
14a00 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
14a10 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
14a20 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
14a30 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
14a40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
14a50 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
14a60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14a70 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
14a80 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
14a90 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
14aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14ab0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
14ac0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
14ad0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
14ae0 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66 64  sOpen==0 ){.#ifd
14af0 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
14b00 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45  T_WAL_SAFETYLEVE
14b10 4c 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66  L.        /* Def
14b20 61 75 6c 74 20 74 6f 20 73 70 65 63 69 66 69 65  ault to specifie
14b30 64 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  d safety_level f
14b40 6f 72 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20  or WAL mode */. 
14b50 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
14b60 64 62 21 3d 30 20 26 26 20 70 42 74 2d 3e 64 62  db!=0 && pBt->db
14b70 2d 3e 61 44 62 21 3d 30 20 29 7b 0a 20 20 20 20  ->aDb!=0 ){.    
14b80 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
14b90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14ba0 20 2a 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b 0a   *db = pBt->db;.
14bb0 20 20 20 20 20 20 20 20 20 20 44 62 20 2a 61 44            Db *aD
14bc0 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20  b = db->aDb;.   
14bd0 20 20 20 20 20 20 20 75 38 20 6c 65 76 65 6c 20         u8 level 
14be0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
14bf0 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
14c00 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
14c10 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
14c20 44 62 5b 69 44 62 5d 2e 70 42 74 20 26 26 20 61  Db[iDb].pBt && a
14c30 44 62 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42 74  Db[iDb].pBt->pBt
14c40 3d 3d 70 42 74 20 29 20 62 72 65 61 6b 3b 0a 20  ==pBt ) break;. 
14c50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14c60 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
14c70 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
14c80 20 20 20 20 20 20 6c 65 76 65 6c 20 3d 20 64 62        level = db
14c90 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74  ->aDb[iDb].safet
14ca0 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20  y_level;.       
14cb0 20 20 20 69 66 28 20 21 53 51 4c 49 54 45 5f 44     if( !SQLITE_D
14cc0 62 53 61 66 65 74 79 4c 65 76 65 6c 49 73 46 69  bSafetyLevelIsFi
14cd0 78 65 64 28 6c 65 76 65 6c 29 20 26 26 20 0a 20  xed(level) && . 
14ce0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
14cf0 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65  ITE_DbSafetyLeve
14d00 6c 56 61 6c 75 65 28 6c 65 76 65 6c 29 20 21 3d  lValue(level) !=
14d10 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14d20 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 29  WAL_SAFETYLEVEL)
14d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14d40 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f  aDb[iDb].safety_
14d50 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44  level = SQLITE_D
14d60 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54  EFAULT_WAL_SAFET
14d70 59 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20 20  YLEVEL;.        
14d80 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
14d90 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
14da0 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
14db0 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
14dc0 41 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20 20  AFETYLEVEL, .   
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14df0 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53      (db->flags&S
14e00 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29  QLITE_FullFSync)
14e10 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  !=0,.           
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e30 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d              (db-
14e40 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6b  >flags&SQLITE_Ck
14e50 70 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30 29  ptFullFSync)!=0)
14e60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14e70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
14e80 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
14e90 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
14ea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14eb0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
14ec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14ed0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
14ee0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ndif..    /* The
14ef0 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
14f00 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
14f10 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
14f20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
14f30 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
14f40 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
14f50 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
14f60 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
14f70 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
14f80 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
14f90 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
14fa0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
14fb0 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
14fc0 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
14fd0 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
14fe0 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
14ff0 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
15000 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
15010 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
15020 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
15030 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
15040 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
15050 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
15060 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
15070 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
15080 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70 61  6);.    if( ((pa
15090 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
150a0 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
150b0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
150c0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
150d0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
150e0 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
150f0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
15100 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
15110 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
15120 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
15130 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
15140 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
15150 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
15160 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
15170 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
15180 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
15190 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
151a0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
151b0 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
151c0 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
151d0 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
151e0 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
151f0 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
15200 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
15210 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
15220 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
15230 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
15240 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
15250 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
15260 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
15270 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
15280 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
15290 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
152a0 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
152b0 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
152c0 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
152d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
152e0 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
152f0 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
15300 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
15310 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
15320 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
15330 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
15340 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
15350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15360 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
15370 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
15380 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
153c0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
153d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
153e0 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
153f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15400 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
15410 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
15420 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
15430 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
15440 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
15450 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
15460 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
15470 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20   usableSize<480 
15480 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
15490 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
154a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
154b0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
154c0 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73  ize;.    pBt->us
154d0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
154e0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
154f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
15500 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
15510 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
15520 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
15530 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
15540 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
15550 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
15560 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
15570 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
15580 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
15590 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
155a0 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
155b0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
155c0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
155d0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
155e0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
155f0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
15600 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
15610 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
15620 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
15630 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
15640 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
15650 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
15660 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
15670 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
15680 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
15690 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
156a0 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
156b0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
156c0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
156d0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
156e0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
156f0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
15700 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
15710 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
15720 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
15730 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
15740 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20  byte pointer, a 
15750 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
15760 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
15770 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
15780 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
15790 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
157a0 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
157b0 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
157c0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
157d0 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
157e0 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
157f0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
15800 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74  255 - 23);.  pBt
15810 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  ->minLocal = (u1
15820 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
15830 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
15840 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78   23);.  pBt->max
15850 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74  Leaf = (u16)(pBt
15860 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33  ->usableSize - 3
15870 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  5);.  pBt->minLe
15880 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  af = (u16)((pBt-
15890 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
158a0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
158b0 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  if( pBt->maxLoca
158c0 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74  l>127 ){.    pBt
158d0 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
158e0 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65  d = 127;.  }else
158f0 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62  {.    pBt->max1b
15900 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38  ytePayload = (u8
15910 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a  )pBt->maxLocal;.
15920 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
15930 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20  t->maxLeaf + 23 
15940 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  <= MX_CELL_SIZE(
15950 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70  pBt) );.  pBt->p
15960 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a  Page1 = pPage1;.
15970 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
15980 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Page;.  return S
15990 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
159a0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
159b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
159c0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
159d0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
159e0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
159f0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
15a00 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
15a10 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
15a20 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
15a30 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
15a40 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
15a50 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
15a60 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
15a70 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
15a80 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
15a90 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
15aa0 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
15ab0 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
15ac0 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
15ad0 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
15ae0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
15af0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
15b00 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
15b10 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
15b20 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
15b30 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
15b40 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
15b50 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
15b60 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
15b70 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
15b80 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
15b90 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
15ba0 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
15bb0 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
15bc0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
15bd0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
15be0 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
15bf0 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
15c00 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
15c10 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
15c20 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
15c30 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
15c40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
15c50 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
15c60 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
15c70 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
15c80 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
15c90 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
15ca0 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
15cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
15cc0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
15cd0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
15ce0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
15cf0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
15d00 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
15d10 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
15d20 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
15d30 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
15d40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
15d50 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
15d60 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
15d70 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
15d80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
15d90 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
15da0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
15db0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
15dc0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
15dd0 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
15de0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
15df0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15e00 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
15e10 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
15e20 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
15e30 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
15e40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15e50 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
15e60 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
15e70 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
15e80 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
15e90 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
15ea0 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
15eb0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
15ec0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
15ed0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
15ee0 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
15ef0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
15f00 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
15f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15f20 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
15f30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15f40 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
15f50 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
15f60 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
15f70 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
15f80 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
15f90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
15fa0 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
15fb0 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
15fc0 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
15fd0 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
15fe0 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
15ff0 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
16000 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
16010 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
16020 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
16030 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
16040 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
16050 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
16060 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
16070 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
16080 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
16090 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
160a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
160b0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
160c0 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
160d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
160e0 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
160f0 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
16100 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
16110 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
16120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16130 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
16140 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
16150 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
16160 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
16170 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
16180 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
16190 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
161a0 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
161b0 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
161c0 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
161d0 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
161e0 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
161f0 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
16200 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
16210 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
16220 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
16230 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
16240 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
16250 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
16260 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
16270 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
16280 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
16290 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
162a0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
162b0 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
162c0 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
162d0 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
162e0 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
162f0 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
16300 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
16310 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
16320 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
16330 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
16340 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
16350 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
16360 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
16370 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
16380 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
16390 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
163a0 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
163b0 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
163c0 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
163d0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
163e0 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
163f0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
16400 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
16410 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
16420 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
16430 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
16440 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
16450 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
16460 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
16470 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
16480 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16490 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
164a0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
164b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
164c0 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
164d0 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
164e0 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
164f0 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
16500 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
16510 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
16520 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
16530 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
16540 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
16550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16560 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
16570 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
16580 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16590 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
165a0 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
165b0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
165c0 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
165d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
165e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
165f0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
16600 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
16610 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
16620 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
16630 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
16640 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
16650 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
16660 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
16670 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
16680 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
16690 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
166a0 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
166b0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
166c0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
166d0 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
166e0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
166f0 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
16700 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
16710 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
16720 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
16730 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
16740 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
16750 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
16760 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
16770 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
16780 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
16790 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
167a0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
167b0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
167c0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
167d0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
167e0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
167f0 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
16800 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
16810 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
16820 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
16830 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
16840 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
16850 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
16860 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
16870 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
16880 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
16890 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
168a0 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
168b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
168c0 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
168d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
168e0 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
168f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
16900 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
16910 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
16920 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
16930 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
16940 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
16950 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
16960 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
16970 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
16980 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
16990 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
169a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
169b0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
169c0 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
169d0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
169e0 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
169f0 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
16a00 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
16a10 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
16a20 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
16a30 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
16a40 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
16a50 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
16a60 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
16a70 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
16a80 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
16a90 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
16aa0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
16ab0 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
16ac0 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
16ad0 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
16ae0 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
16af0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
16b00 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
16b10 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
16b20 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
16b30 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
16b40 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
16b50 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
16b60 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
16b70 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
16b80 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
16b90 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
16ba0 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
16bb0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
16bc0 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
16bd0 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
16be0 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
16bf0 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
16c00 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
16c10 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
16c20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
16c30 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
16c40 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
16c50 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
16c60 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
16c70 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
16c80 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
16c90 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
16ca0 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
16cb0 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69   wrflag){.  sqli
16cc0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
16cd0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16ce0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
16cf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16d00 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
16d10 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
16d20 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
16d30 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65    /* If the btre
16d40 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
16d50 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
16d60 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20  ion, or it.  ** 
16d70 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
16d80 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
16d90 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e   and a read-tran
16da0 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  saction.  ** is 
16db0 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20  requested, this 
16dc0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
16dd0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
16de0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s==TRANS_WRITE |
16df0 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  | (p->inTrans==T
16e00 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72  RANS_READ && !wr
16e10 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74  flag) ){.    got
16e20 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
16e30 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
16e40 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
16e50 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
16e60 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
16e70 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30  >bDoTruncate)==0
16e80 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   );..  /* Write 
16e90 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
16ea0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
16eb0 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
16ec0 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28  abase */.  if( (
16ed0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
16ee0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
16ef0 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  0 && wrflag ){. 
16f00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
16f10 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
16f20 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
16f30 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
16f40 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
16f50 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
16f60 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
16f70 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
16f80 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
16f90 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
16fa0 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
16fb0 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
16fc0 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
16fd0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
16fe0 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
16ff0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
17000 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
17010 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
17020 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
17030 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a  n==TRANS_WRITE).
17040 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46     || (pBt->btsF
17050 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
17060 4e 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  NG)!=0.  ){.    
17070 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
17080 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
17090 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
170a0 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
170b0 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
170c0 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
170d0 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
170e0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
170f0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
17100 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
17110 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
17120 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
17130 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17140 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
17150 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
17160 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
17170 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
17180 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
17190 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
171a0 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
171b0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
171c0 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
171d0 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
171e0 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
171f0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
17200 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
17210 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
17220 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
17230 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
17240 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
17250 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
17260 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
17270 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
17280 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
17290 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
172a0 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
172b0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
172c0 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
172d0 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
172e0 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
172f0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
17300 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
17310 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
17320 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
17330 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
17340 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17350 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
17360 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
17370 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
17380 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
17390 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
173a0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
173b0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
173c0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
173d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
173e0 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
173f0 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
17400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
17410 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
17420 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
17430 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
17440 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
17450 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
17460 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
17470 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
17480 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
17490 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
174a0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
174b0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
174c0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
174d0 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
174e0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
174f0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
17500 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
17510 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
17520 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
17530 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
17540 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
17550 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17560 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
17570 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
17580 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
17590 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
175a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
175b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
175c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
175d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
175e0 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
175f0 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
17600 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
17610 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
17620 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
17640 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
17650 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
17660 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
17670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
17690 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
176a0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
176b0 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
176c0 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
176d0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
176e0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
176f0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
17700 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
17710 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
17720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17730 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
17740 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
17750 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
17760 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
17770 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
17780 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
17790 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
177a0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
177b0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
177c0 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
177d0 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
177e0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
177f0 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
17800 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
17810 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
17820 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
17830 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
17840 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
17850 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
17860 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
17870 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
17880 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
17890 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
178a0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
178b0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
178c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
178d0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
178e0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
178f0 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
17900 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
17910 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
17920 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17930 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
17940 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
17950 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
17960 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
17970 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
17980 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
17990 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
179a0 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
179b0 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
179c0 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
179d0 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
179e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
179f0 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
17a00 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
17a10 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
17a20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
17a30 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
17a40 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
17a50 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
17a60 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
17a70 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
17a80 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
17a90 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
17aa0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
17ab0 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
17ac0 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
17ad0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
17ae0 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
17af0 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
17b00 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
17b10 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
17b20 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
17b30 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
17b40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
17b50 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
17b60 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
17b70 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
17b80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17b90 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
17ba0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
17bb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
17bd0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
17be0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
17bf0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
17c00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17c10 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62   }.  }...trans_b
17c20 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
17c30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
17c40 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
17c50 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
17c60 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
17c70 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
17c80 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
17c90 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
17ca0 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
17cb0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
17cc0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
17cd0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
17ce0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
17cf0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
17d00 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
17d10 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
17d20 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
17d30 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
17d40 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
17d50 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
17d60 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
17d70 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
17d80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17d90 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17da0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
17db0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17dc0 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
17dd0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
17de0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
17df0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
17e00 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
17e10 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
17e20 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
17e30 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
17e40 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
17e50 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
17e60 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
17e70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
17e80 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
17e90 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
17ea0 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
17eb0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
17ee0 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
17ef0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17f20 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
17f30 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
17f40 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17f70 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
17f80 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
17f90 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
17fa0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
17fb0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
17fc0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
17fd0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
17fe0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
17ff0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
18000 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69  .  rc = btreeIni
18010 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
18020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18030 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
18040 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
18050 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
18060 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
18070 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
18080 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
18090 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
180a0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
180b0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
180c0 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
180d0 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
180e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
180f0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
18100 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
18110 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
18120 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
18130 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
18140 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
18150 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
18160 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
18170 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
18180 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
18190 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
181a0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
181b0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
181c0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
181d0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
181e0 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
181f0 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
18200 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
18210 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
18220 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
18230 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18240 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
18250 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
18260 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
18270 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
18280 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
18290 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
182a0 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
182b0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
182c0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
182d0 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
182e0 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
182f0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
18300 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
18310 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
18320 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
18330 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
18340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18350 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
18360 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
18370 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
18380 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
18390 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
183a0 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
183b0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
183c0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
183d0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
183e0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
183f0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
18400 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
18410 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
18420 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
18430 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
18440 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
18450 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
18460 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
18470 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
18480 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
18490 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
184a0 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
184b0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
184c0 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
184d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
184e0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
184f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
18500 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
18510 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
18520 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
18530 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
18540 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
18550 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
18560 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
18570 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
18580 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
18590 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
185a0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
185b0 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
185c0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
185d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
185e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
185f0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
18600 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
18610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
18620 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
18630 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
18640 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
18650 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65  Cell;..    btree
18660 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
18670 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
18680 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
18690 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
186a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
186b0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
186c0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
186d0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
186e0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
186f0 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
18700 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
18710 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
18720 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
18730 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
18740 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
18750 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26 26  flow.         &&
18760 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65   pCell+info.iOve
18770 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d 3e  rflow+3<=pPage->
18780 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
18790 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26  kPage.         &
187a0 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  & iFrom==get4byt
187b0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
187c0 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20 20  verflow]).      
187d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70    ){.          p
187e0 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
187f0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
18800 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
18810 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
18820 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18830 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
18840 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
18850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
18860 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
18870 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
18880 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
18890 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
188a0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
188b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
188c0 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
188d0 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
188e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
188f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
18900 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
18910 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
18920 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18930 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
18940 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
18950 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
18960 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
18970 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
18980 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
18990 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
189a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
189b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
189c0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
189d0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
189e0 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
189f0 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
18a00 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
18a10 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
18a20 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
18a30 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
18a40 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
18a50 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
18a60 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
18a70 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
18a80 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
18a90 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
18aa0 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
18ab0 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
18ac0 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
18ad0 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
18ae0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
18af0 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
18b00 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
18b10 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
18b20 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
18b30 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
18b40 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
18b50 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
18b60 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
18b70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
18b80 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
18b90 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18bb0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
18bc0 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
18bd0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
18be0 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
18bf0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
18c00 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
18c10 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
18c20 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
18c30 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
18c40 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
18c50 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
18c60 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18c80 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
18c90 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
18ca0 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
18cb0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
18cc0 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
18cd0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
18ce0 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
18cf0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
18d00 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
18d10 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
18d20 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
18d30 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
18d40 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
18d50 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
18d60 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
18d70 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
18d80 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
18d90 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
18da0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
18db0 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
18dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18dd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18de0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
18df0 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
18e00 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==pBt );..  /* M
18e10 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65  ove page iDbPage
18e20 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e   from its curren
18e30 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61  t location to pa
18e40 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50  ge number iFreeP
18e50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28  age */.  TRACE((
18e60 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76  "AUTOVACUUM: Mov
18e70 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70  ing %d to free p
18e80 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65  age %d (ptr page
18e90 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c   %d type %d)\n",
18ea0 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c   .      iDbPage,
18eb0 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72   iFreePage, iPtr
18ec0 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20  Page, eType));. 
18ed0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
18ee0 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65  erMovepage(pPage
18ef0 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50  r, pDbPage->pDbP
18f00 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
18f10 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28  isCommit);.  if(
18f20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18f30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
18f40 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e  .  }.  pDbPage->
18f50 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65  pgno = iFreePage
18f60 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61  ;..  /* If pDbPa
18f70 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70  ge was a btree-p
18f80 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  age, then it may
18f90 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65   have child page
18fa0 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20  s and/or cells. 
18fb0 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
18fc0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
18fd0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  . The pointer ma
18fe0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
18ff0 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67  l these.  ** pag
19000 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68  es need to be ch
19010 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  anged..  **.  **
19020 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61   If pDbPage is a
19030 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
19040 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
19050 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72  4 bytes may stor
19060 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72  e a.  ** pointer
19070 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74   to a subsequent
19080 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
19090 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
190a0 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74  ase, then.  ** t
190b0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e  he pointer map n
190c0 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74  eeds to be updat
190d0 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  ed for the subse
190e0 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  quent overflow p
190f0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
19100 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
19110 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
19120 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
19130 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69  .    rc = setChi
19140 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67  ldPtrmaps(pDbPag
19150 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
19160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19170 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19180 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
19190 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d   Pgno nextOvfl =
191a0 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67   get4byte(pDbPag
191b0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69  e->aData);.    i
191c0 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29  f( nextOvfl!=0 )
191d0 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
191e0 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
191f0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
19200 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72  2, iFreePage, &r
19210 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
19220 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19230 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19250 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68    }..  /* Fix th
19260 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74  e database point
19270 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50  er on page iPtrP
19280 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64  age that pointed
19290 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20   at iDbPage so. 
192a0 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e   ** that it poin
192b0 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e  ts at iFreePage.
192c0 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f   Also fix the po
192d0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
192e0 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67  for.  ** iPtrPag
192f0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
19300 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
19310 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
19320 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
19330 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50  t, iPtrPage, &pP
19340 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  trPage, 0);.    
19350 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19360 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
19370 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
19380 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19390 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d  rWrite(pPtrPage-
193a0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
193b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
193c0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
193d0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
193e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
193f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
19400 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
19410 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62  er(pPtrPage, iDb
19420 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
19430 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c   eType);.    rel
19440 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67  easePage(pPtrPag
19450 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
19460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19470 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
19480 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
19490 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72  pe, iPtrPage, &r
194a0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  c);.    }.  }.  
194b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
194c0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
194d0 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79  tion required by
194e0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
194f0 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ). */.static int
19500 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
19510 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d  ge(BtShared *, M
19520 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20  emPage **, Pgno 
19530 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f  *, Pgno, u8);../
19540 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73  *.** Perform a s
19550 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e  ingle step of an
19560 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
19570 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66  uum. If successf
19580 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51  ul, return.** SQ
19590 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72  LITE_OK. If ther
195a0 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20  e is no work to 
195b0 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72  do (and therefor
195c0 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a  e no point in .*
195d0 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  * calling this f
195e0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
195f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
19600 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72  NE. Or, if an er
19610 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20  ror .** occurs, 
19620 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65  return some othe
19630 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  r error code..**
19640 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
19650 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  cally, this func
19660 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
19670 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
19680 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a   database so .**
19690 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
196a0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
196b0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
196c0 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
196d0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61   use..**.** Para
196e0 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68  meter nFin is th
196f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
19700 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61  s that this data
19710 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61  base would conta
19720 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20  in.** were this 
19730 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  function called 
19740 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
19750 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
19760 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d  .** If the bComm
19770 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  it parameter is 
19780 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66  non-zero, this f
19790 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
197a0 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c  that the .** cal
197b0 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
197c0 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
197d0 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20  Step() until it 
197e0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
197f0 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72  ONE .** or an er
19800 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20  ror. bCommit is 
19810 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20  passed true for 
19820 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f  an auto-vacuum-o
19830 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65  n-commit .** ope
19840 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65  ration, or false
19850 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e   for an incremen
19860 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73  tal vacuum..*/.s
19870 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
19880 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
19890 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
198a0 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c  n, Pgno iLastPg,
198b0 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20   int bCommit){. 
198c0 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
198d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
198e0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
198f0 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
19900 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  list */.  int rc
19910 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
19920 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19930 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19940 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67   assert( iLastPg
19950 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20  >nFin );..  if( 
19960 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  !PTRMAP_ISPAGE(p
19970 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20  Bt, iLastPg) && 
19980 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47  iLastPg!=PENDING
19990 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
199a0 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  ){.    u8 eType;
199b0 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
199c0 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
199d0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
199e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
199f0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
19a00 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a  nFreeList==0 ){.
19a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19a20 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
19a30 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
19a40 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67  Get(pBt, iLastPg
19a50 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50  , &eType, &iPtrP
19a60 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
19a70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19a80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19a90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54      }.    if( eT
19aa0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
19ab0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65  PAGE ){.      re
19ac0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19ad0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
19ae0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
19af0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
19b00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  ){.      if( bCo
19b10 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
19b20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
19b30 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
19b40 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20  iles free-list. 
19b50 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
19b60 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ired.        ** 
19b70 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f  if bCommit is no
19b80 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20  n-zero. In that 
19b90 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c  case, the free-l
19ba0 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ist will be.    
19bb0 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64      ** truncated
19bc0 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74   to zero after t
19bd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
19be0 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73  urns, so it does
19bf0 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  n't .        ** 
19c00 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69  matter if it sti
19c10 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65  ll contains some
19c20 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73   garbage entries
19c30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
19c40 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
19c50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61  g;.        MemPa
19c60 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
19c70 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
19c80 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
19c90 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
19ca0 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54  ePg, iLastPg, BT
19cb0 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20  ALLOC_EXACT);.  
19cc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
19cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19ce0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19d00 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
19d10 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  g==iLastPg );.  
19d20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
19d30 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
19d40 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
19d50 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65  .      Pgno iFre
19d60 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  ePg;            
19d70 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65   /* Index of fre
19d80 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70  e page to move p
19d90 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20  LastPg to */.   
19da0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73     MemPage *pLas
19db0 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d  tPg;.      u8 eM
19dc0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e  ode = BTALLOC_AN
19dd0 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72  Y;   /* Mode par
19de0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
19df0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
19e00 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65  /.      Pgno iNe
19e10 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ar = 0;         
19e20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61    /* nearby para
19e30 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
19e40 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
19e50 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ..      rc = btr
19e60 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
19e70 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
19e80 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
19e90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19ea0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19eb0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
19ec0 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74     /* If bCommit
19ed0 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
19ee0 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
19ef0 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
19f00 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
19f10 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
19f20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
19f30 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
19f40 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
19f50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19f60 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
19f70 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73  d, if bCommit is
19f80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
19f90 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
19fa0 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
19fb0 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
19fc0 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
19fd0 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
19fe0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
19ff0 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
1a000 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
1a010 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d     if( bCommit==
1a020 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f  0 ){.        eMo
1a030 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b  de = BTALLOC_LE;
1a040 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d  .        iNear =
1a050 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20   nFin;.      }. 
1a060 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20       do {.      
1a070 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1a080 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1a090 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1a0a0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1a0b0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61  , &iFreePg, iNea
1a0c0 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20  r, eMode);.     
1a0d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a0e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a0f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1a100 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
1a110 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1a130 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1a140 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
1a150 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46  e( bCommit && iF
1a160 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
1a170 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1a180 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
1a190 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
1a1a0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
1a1b0 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
1a1c0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
1a1d0 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a  eePg, bCommit);.
1a1e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1a1f0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1a200 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a210 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1a220 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1a230 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
1a240 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1a250 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1a260 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d  iLastPg--;.    }
1a270 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
1a280 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1a290 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50  E(pBt) || PTRMAP
1a2a0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1a2b0 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74  stPg) );.    pBt
1a2c0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1a2d0 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  1;.    pBt->nPag
1a2e0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
1a2f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a300 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1a310 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65  e database opene
1a320 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61  d by the first a
1a330 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75  rgument is an au
1a340 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1a350 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65  se.** nOrig page
1a360 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
1a370 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20  ning nFree free 
1a380 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68  pages. Return th
1a390 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73  e expected .** s
1a3a0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1a3b0 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c  ase in pages fol
1a3c0 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76  lowing an auto-v
1a3d0 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e  acuum operation.
1a3e0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
1a3f0 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68  finalDbSize(BtSh
1a400 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
1a410 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65  nOrig, Pgno nFre
1a420 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79  e){.  int nEntry
1a430 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a440 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1a450 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e  of entries on on
1a460 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f  e ptrmap page */
1a470 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b  .  Pgno nPtrmap;
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a490 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1a4a0 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
1a4b0 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67  be freed */.  Pg
1a4c0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a4e0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1a4f0 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74  ..  nEntry = pBt
1a500 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
1a510 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72    nPtrmap = (nFr
1a520 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f  ee-nOrig+PTRMAP_
1a530 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69  PAGENO(pBt, nOri
1a540 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72  g)+nEntry)/nEntr
1a550 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69  y;.  nFin = nOri
1a560 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72  g - nFree - nPtr
1a570 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67  map;.  if( nOrig
1a580 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
1a590 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
1a5a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1a5b0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46  E(pBt) ){.    nF
1a5c0 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  in--;.  }.  whil
1a5d0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
1a5e0 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
1a5f0 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
1a600 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1a610 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a     nFin--;.  }..
1a620 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d    return nFin;.}
1a630 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ../*.** A write-
1a640 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1a650 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72   be opened befor
1a660 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  e calling this f
1a670 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70  unction..** It p
1a680 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65  erforms a single
1a690 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f   unit of work to
1a6a0 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65  wards an increme
1a6b0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a  ntal vacuum..**.
1a6c0 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d  ** If the increm
1a6d0 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20  ental vacuum is 
1a6e0 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74  finished after t
1a6f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
1a700 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f   run,.** SQLITE_
1a710 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64  DONE is returned
1a720 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66  . If it is not f
1a730 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20  inished, but no 
1a740 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a  error occurred,.
1a750 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1a760 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
1a770 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72  ise an SQLite er
1a780 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e  ror code. .*/.in
1a790 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
1a7a0 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  crVacuum(Btree *
1a7b0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1a7c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a7d0 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
1a7e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a7f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a800 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1a810 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d  RANS_WRITE && p-
1a820 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a830 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21  WRITE );.  if( !
1a840 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1a850 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a860 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65  TE_DONE;.  }else
1a870 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  {.    Pgno nOrig
1a880 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1a890 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f  t(pBt);.    Pgno
1a8a0 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1a8b0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1a8c0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1a8d0 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61  Pgno nFin = fina
1a8e0 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72  lDbSize(pBt, nOr
1a8f0 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20  ig, nFree);..   
1a900 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20   if( nOrig<nFin 
1a910 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1a920 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1a930 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
1a940 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1a950 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
1a960 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
1a970 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1a980 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a990 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41       invalidateA
1a9a0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
1a9b0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63  pBt);.        rc
1a9c0 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
1a9d0 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72  p(pBt, nFin, nOr
1a9e0 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ig, 0);.      }.
1a9f0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1aa00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1aa10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1aa20 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1aa30 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1aa40 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
1aa50 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1aa60 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e  aData[28], pBt->
1aa70 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  nPage);.      }.
1aa80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aa90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1aaa0 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  E;.    }.  }.  s
1aab0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1aac0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1aad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1aae0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1aaf0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
1ab00 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
1ab10 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
1ab20 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  .** is committed
1ab30 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63   for an auto-vac
1ab40 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  uum database..**
1ab50 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1ab60 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1ab70 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73  en *pnTrunc is s
1ab80 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
1ab90 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65   of pages.** the
1aba0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
1abb0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
1abc0 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65  ed to during the
1abd0 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1abe0 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61   .** i.e. the da
1abf0 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1ac00 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74  reorganized so t
1ac10 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72  hat only the fir
1ac20 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70  st *pnTrunc.** p
1ac30 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e  ages are in use.
1ac40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1ac50 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1ac60 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1ac70 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1ac80 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70  E_OK;.  Pager *p
1ac90 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
1aca0 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ger;.  VVA_ONLY(
1acb0 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69   int nRef = sqli
1acc0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1acd0 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61  (pPager) );..  a
1ace0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1acf0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1ad00 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
1ad10 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1ad20 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
1ad30 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
1ad40 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
1ad50 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
1ad60 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  .    Pgno nFin; 
1ad70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1ad80 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61  r of pages in da
1ad90 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74  tabase after aut
1ada0 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20  ovacuuming */.  
1adb0 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20    Pgno nFree;   
1adc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1add0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
1ade0 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c  reelist initiall
1adf0 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46  y */.    Pgno iF
1ae00 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ree;        /* T
1ae10 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20  he next page to 
1ae20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
1ae30 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
1ae40 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
1ae50 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
1ae60 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
1ae70 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
1ae80 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
1ae90 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1aea0 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
1aeb0 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
1aec0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1aed0 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
1aee0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
1aef0 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
1af00 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
1af10 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
1af20 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
1af30 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
1af40 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
1af50 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
1af60 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
1af70 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
1af80 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
1af90 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1afa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1afb0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1afc0 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
1afd0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1afe0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1aff0 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66  ]);.    nFin = f
1b000 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20  inalDbSize(pBt, 
1b010 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20  nOrig, nFree);. 
1b020 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
1b030 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
1b040 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1b050 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72      if( nFin<nOr
1b060 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ig ){.      rc =
1b070 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1b080 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
1b090 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d  }.    for(iFree=
1b0a0 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69  nOrig; iFree>nFi
1b0b0 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  n && rc==SQLITE_
1b0c0 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20  OK; iFree--){.  
1b0d0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1b0e0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1b0f0 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20  n, iFree, 1);.  
1b100 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
1b110 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
1b120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
1b130 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
1b140 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1b150 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
1b160 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1b170 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1b180 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1b190 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
1b1a0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1b1b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1b1c0 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
1b1d0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1b1e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1b1f0 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
1b200 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1b210 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   1;.      pBt->n
1b220 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Page = nFin;.   
1b230 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
1b240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b250 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f    sqlite3PagerRo
1b260 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1b270 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
1b280 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74  ert( nRef>=sqlit
1b290 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1b2a0 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74  pPager) );.  ret
1b2b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1b2c0 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54   /* ifndef SQLIT
1b2d0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1b2e0 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65  M */.# define se
1b2f0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29  tChildPtrmaps(x)
1b300 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
1b310 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1b320 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66  utine does the f
1b330 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20  irst phase of a 
1b340 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  two-phase commit
1b350 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
1b360 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c  ** causes a roll
1b370 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20  back journal to 
1b380 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69  be created (if i
1b390 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
1b3a0 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64  dy exist).** and
1b3b0 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1b3c0 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69  enough informati
1b3d0 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20  on so that if a 
1b3e0 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72  power loss occur
1b3f0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1b400 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  e can be restore
1b410 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
1b420 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69  l state by playi
1b430 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a  ng back.** the j
1b440 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68  ournal.  Then th
1b450 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1b460 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c  e journal are fl
1b470 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20  ushed out to.** 
1b480 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72  the disk.  After
1b490 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1b4a0 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c  safely on oxide,
1b4b0 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20   the changes to 
1b4c0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1b4d0 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
1b4e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1b4f0 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74  le and flushed t
1b500 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74  o oxide..** At t
1b510 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63  he end of this c
1b520 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  all, the rollbac
1b530 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20  k journal still 
1b540 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a  exists on the.**
1b550 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65   disk and we are
1b560 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
1b570 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65  ll locks, so the
1b580 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1b590 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   not.** committe
1b5a0 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42  d.  See sqlite3B
1b5b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1b5c0 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  wo() for the sec
1b5d0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
1b5e0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
1b5f0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
1b600 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
1b610 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
1b620 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
1b630 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
1b640 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
1b650 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
1b660 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1b670 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
1b680 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
1b690 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
1b6a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b6b0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
1b6c0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
1b6d0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
1b6e0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
1b6f0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
1b700 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
1b710 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
1b720 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
1b730 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
1b740 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1b750 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
1b760 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1b770 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
1b780 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
1b790 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
1b7a0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
1b7b0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
1b7c0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
1b7d0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
1b7e0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
1b7f0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
1b800 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
1b810 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
1b820 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b830 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
1b840 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
1b850 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
1b860 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b870 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1b880 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
1b890 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
1b8a0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
1b8b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1b8c0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1b8d0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1b8e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1b8f0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
1b900 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1b910 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b920 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1b930 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
1b940 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
1b950 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d   rc = autoVacuum
1b960 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20  Commit(pBt);.   
1b970 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b980 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b990 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b9a0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65  e(p);.        re
1b9b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1b9c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1b9d0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1b9e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b9f0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1ba00 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
1ba10 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
1ba20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
1ba30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1ba40 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
1ba50 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
1ba60 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
1ba70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1ba80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ba90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1baa0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1bab0 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74  led from both Bt
1bac0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1bad0 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c  o() and BtreeRol
1bae0 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68  lback().** at th
1baf0 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
1bb00 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  a transaction..*
1bb10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
1bb20 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1bb30 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  n(Btree *p){.  B
1bb40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1bb50 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1bb60 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
1bb70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1bb80 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
1bb90 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) );..#ifndef SQ
1bba0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1bbb0 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54  CUUM.  pBt->bDoT
1bbc0 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e  runcate = 0;.#en
1bbd0 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  dif.  if( p->inT
1bbe0 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1bbf0 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  && db->nVdbeRead
1bc00 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  >1 ){.    /* If 
1bc10 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20  there are other 
1bc20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
1bc30 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
1bc40 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20   this database. 
1bc50 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f     ** handle, do
1bc60 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61  wngrade to a rea
1bc70 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1bc80 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74  on. The other st
1bc90 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20  atements.    ** 
1bca0 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61  may still be rea
1bcb0 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
1bcc0 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  tabase.  */.    
1bcd0 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72  downgradeAllShar
1bce0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1bcf0 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54  s(p);.    p->inT
1bd00 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41  rans = TRANS_REA
1bd10 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1bd20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1bd30 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66   had any kind of
1bd40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1bd50 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
1bd60 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
1bd70 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68  tion count of th
1bd80 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20  e shared btree. 
1bd90 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  If the transacti
1bda0 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a  on count .    **
1bdb0 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20   reaches 0, set 
1bdc0 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
1bdd0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20   to TRANS_NONE. 
1bde0 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  The unlockBtreeI
1bdf0 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a  fUnused().    **
1be00 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c   call below will
1be10 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
1be20 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  r.  */.    if( p
1be30 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
1be40 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63  _NONE ){.      c
1be50 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
1be60 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
1be70 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1be80 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20  nsaction--;.    
1be90 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
1bea0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1beb0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
1bec0 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1bed0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
1bee0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
1bef0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
1bf00 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74  nsaction state t
1bf10 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64  o TRANS_NONE and
1bf20 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20   unlock the .   
1bf30 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69   ** pager if thi
1bf40 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
1bf50 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
1bf60 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
1bf70 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54  .  */.    p->inT
1bf80 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
1bf90 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  E;.    unlockBtr
1bfa0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1bfb0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74  .  }..  btreeInt
1bfc0 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a  egrity(p);.}../*
1bfd0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74  .** Commit the t
1bfe0 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65  ransaction curre
1bff0 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73  ntly in progress
1c000 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1c010 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
1c020 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1c030 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f   of a 2-phase co
1c040 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71  mmit.  The.** sq
1c050 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1c060 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69  PhaseOne() routi
1c070 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
1c080 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
1c090 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64  ld.** be invoked
1c0a0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
1c0b0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
1c0c0 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
1c0d0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1c0e0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64  ).** routine did
1c0f0 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66   all the work of
1c100 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61   writing informa
1c110 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tion out to disk
1c120 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68   and flushing th
1c130 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f  e.** contents so
1c140 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77   that they are w
1c150 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20  ritten onto the 
1c160 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41  disk platter.  A
1c170 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  ll this.** routi
1c180 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20  ne has to do is 
1c190 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61  delete or trunca
1c1a0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68  te or zero the h
1c1b0 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20  eader in the.** 
1c1c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1c1d0 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73  rnal (which caus
1c1e0 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  es the transacti
1c1f0 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e  on to commit) an
1c200 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e  d.** drop locks.
1c210 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1c220 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
1c230 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61  urs while the pa
1c240 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74  ger layer is att
1c250 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66  empting to .** f
1c260 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  inalize the unde
1c270 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66  rlying journal f
1c280 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
1c290 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  on returns an er
1c2a0 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75  ror and.** the u
1c2b0 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20  pper layer will 
1c2c0 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61  attempt a rollba
1c2d0 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ck. However, if 
1c2e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1c2f0 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  ent.** is non-ze
1c300 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74  ro then this b-t
1c310 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ree transaction 
1c320 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c  is part of a mul
1c330 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e  ti-file .** tran
1c340 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73  saction. In this
1c350 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73   case, the trans
1c360 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
1c370 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65  dy been committe
1c380 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69  d .** (by deleti
1c390 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ng a master jour
1c3a0 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68  nal file) and th
1c3b0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67  e caller will ig
1c3c0 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  nore this .** fu
1c3d0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63  nctions return c
1c3e0 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66  ode. So, even if
1c3f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c400 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61   in the pager la
1c410 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68  yer,.** reset th
1c420 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73  e b-tree objects
1c430 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20   internal state 
1c440 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1c450 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72   the write.** tr
1c460 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65  ansaction has be
1c470 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20  en closed. This 
1c480 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61  is quite safe, a
1c490 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c  s the pager will
1c4a0 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74   have.** transit
1c4b0 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72  ioned to the err
1c4c0 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  or state..**.** 
1c4d0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1c4e0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1c4f0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1c500 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1c510 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1c520 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1c530 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1c540 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1c550 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1c560 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
1c570 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61  ee *p, int bClea
1c580 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e  nup){..  if( p->
1c590 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1c5a0 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ONE ) return SQL
1c5b0 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65  ITE_OK;.  sqlite
1c5c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1c5d0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1c5e0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
1c5f0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77  e handle has a w
1c600 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1c610 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68   open, commit th
1c620 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20  e shared-btrees 
1c630 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1c640 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68  n and set the sh
1c650 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
1c660 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20  ANS_READ..  */. 
1c670 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1c680 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1c690 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1c6a0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1c6b0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
1c6c0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1c6d0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1c6e0 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
1c6f0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
1c700 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
1c710 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
1c720 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
1c730 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1c740 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c750 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30  K && bCleanup==0
1c760 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c770 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1c780 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c790 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
1c7a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1c7b0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
1c7c0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
1c7d0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
1c7e0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
1c7f0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
1c800 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1c810 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c820 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
1c830 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
1c840 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
1c850 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1c860 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
1c870 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1c880 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1c890 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c8a0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1c8b0 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
1c8c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c8d0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
1c8e0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1c8f0 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d  seTwo(p, 0);.  }
1c900 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c910 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1c920 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1c930 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
1c940 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
1c950 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
1c960 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
1c970 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
1c980 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
1c990 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
1c9a0 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
1c9b0 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
1c9c0 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
1c9d0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
1c9e0 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
1c9f0 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
1ca00 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1ca10 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
1ca20 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
1ca30 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
1ca40 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
1ca50 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
1ca60 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
1ca70 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
1ca80 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
1ca90 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
1caa0 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
1cab0 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
1cac0 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
1cad0 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
1cae0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
1caf0 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
1cb00 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
1cb10 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
1cb20 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
1cb30 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
1cb40 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
1cb50 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
1cb60 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
1cb70 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
1cb80 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
1cb90 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
1cba0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1cbb0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
1cbc0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
1cbd0 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
1cbe0 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
1cbf0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
1cc00 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1cc10 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
1cc20 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
1cc30 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1cc40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1cc50 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
1cc60 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1cc70 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
1cc80 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
1cc90 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
1cca0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1ccb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
1ccc0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1ccd0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1cce0 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
1ccf0 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
1cd00 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1cd10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1cd20 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
1cd30 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1cd40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1cd50 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
1cd60 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
1cd70 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
1cd80 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
1cd90 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
1cda0 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
1cdb0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
1cdc0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1cdd0 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
1cde0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
1cdf0 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
1ce00 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1ce10 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1ce20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1ce30 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1ce40 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1ce50 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1ce60 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1ce70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1ce80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ce90 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1cea0 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
1ceb0 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  de){.  int rc;. 
1cec0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1ced0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
1cee0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 73  ge *pPage1;..  s
1cef0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1cf00 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
1cf10 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1cf20 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
1cf30 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
1cf40 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1cf50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1cf60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cf70 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
1cf80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1cf90 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1cfa0 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 29 3b  rs(p, tripCode);
1cfb0 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
1cfc0 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
1cfd0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1cfe0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1cff0 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
1d000 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
1d010 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
1d020 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
1d030 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1d040 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
1d050 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1d060 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
1d070 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1d080 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
1d090 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
1d0a0 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
1d0b0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1d0c0 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
1d0d0 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
1d0e0 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
1d0f0 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
1d100 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
1d110 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
1d120 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
1d130 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
1d140 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
1d150 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
1d160 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
1d170 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1d180 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
1d190 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
1d1a0 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
1d1b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
1d1c0 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
1d1d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1d1e0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
1d1f0 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
1d200 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
1d210 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
1d220 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1d230 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
1d240 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
1d250 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1d260 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
1d270 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
1d280 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1d290 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1d2a0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1d2b0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1d2c0 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1d2d0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1d2e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1d2f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1d300 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d310 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
1d320 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1d330 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1d340 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
1d350 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
1d360 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
1d370 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1d380 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
1d390 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
1d3a0 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
1d3b0 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
1d3c0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
1d3d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
1d3e0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
1d3f0 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
1d400 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
1d410 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
1d420 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
1d430 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1d440 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
1d450 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
1d460 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
1d470 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
1d480 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
1d490 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
1d4a0 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
1d4b0 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
1d4c0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
1d4d0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
1d4e0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
1d4f0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
1d500 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
1d510 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1d520 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
1d530 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1d540 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
1d550 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
1d560 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
1d570 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
1d580 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
1d590 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
1d5a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1d5b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1d5c0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
1d5d0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
1d5e0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
1d5f0 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
1d600 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
1d610 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
1d620 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
1d630 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
1d640 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
1d650 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
1d660 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
1d670 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
1d680 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
1d690 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
1d6a0 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
1d6b0 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
1d6c0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
1d6d0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
1d6e0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
1d6f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1d700 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
1d710 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
1d720 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1d730 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d740 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
1d750 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1d760 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
1d770 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1d780 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
1d790 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1d7a0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
1d7b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1d7c0 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
1d7d0 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
1d7e0 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
1d7f0 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
1d800 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1d810 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1d820 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
1d830 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
1d840 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1d850 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
1d860 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
1d870 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
1d880 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
1d890 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
1d8a0 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
1d8b0 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
1d8c0 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
1d8d0 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
1d8e0 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
1d8f0 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
1d900 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
1d910 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
1d920 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
1d930 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
1d940 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d950 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1d960 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
1d970 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
1d980 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1d990 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1d9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
1d9b0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
1d9c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
1d9d0 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
1d9e0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
1d9f0 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
1da00 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
1da10 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
1da20 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
1da30 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
1da40 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
1da50 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
1da60 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
1da70 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
1da80 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
1da90 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
1daa0 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
1dab0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
1dac0 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
1dad0 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
1dae0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1daf0 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
1db00 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
1db10 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
1db20 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
1db30 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
1db40 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
1db50 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
1db60 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
1db70 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
1db80 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
1db90 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
1dba0 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
1dbb0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
1dbc0 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
1dbd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1dbe0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
1dbf0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
1dc00 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
1dc10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1dc20 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
1dc30 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
1dc40 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1dc50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1dc60 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
1dc70 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
1dc80 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
1dc90 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1dca0 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
1dcb0 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
1dcc0 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
1dcd0 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
1dce0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
1dcf0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
1dd00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1dd10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1dd20 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
1dd30 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
1dd40 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
1dd50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dd60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
1dd70 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
1dd80 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1dd90 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1dda0 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
1ddb0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
1ddc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ddd0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
1dde0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
1ddf0 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
1de00 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
1de10 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
1de20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1de30 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
1de40 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
1de50 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
1de60 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
1de70 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1de80 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
1de90 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
1dea0 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
1deb0 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
1dec0 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
1ded0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1dee0 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
1def0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1df00 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1df10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1df20 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1df30 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
1df40 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
1df50 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
1df60 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
1df70 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
1df80 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
1df90 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1dfa0 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
1dfb0 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
1dfc0 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
1dfd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
1dfe0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
1dff0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
1e000 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
1e010 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1e020 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
1e030 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
1e040 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
1e050 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
1e060 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
1e070 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
1e080 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
1e090 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
1e0a0 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
1e0b0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1e0c0 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
1e0d0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
1e0e0 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
1e0f0 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
1e100 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
1e110 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
1e120 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
1e130 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
1e140 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
1e150 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
1e160 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
1e170 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
1e180 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
1e190 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
1e1a0 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
1e1b0 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
1e1c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
1e1d0 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
1e1e0 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
1e1f0 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
1e200 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
1e210 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
1e220 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
1e230 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
1e240 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
1e250 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
1e260 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
1e270 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
1e280 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
1e290 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
1e2a0 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
1e2b0 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
1e2c0 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
1e2d0 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
1e2e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
1e2f0 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
1e300 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
1e310 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
1e320 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
1e330 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
1e340 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
1e350 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1e360 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
1e370 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
1e380 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
1e390 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
1e3a0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
1e3b0 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
1e3c0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1e3d0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
1e3e0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
1e3f0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
1e400 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
1e410 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
1e420 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1e430 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
1e440 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
1e450 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
1e460 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
1e470 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
1e480 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
1e490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e4a0 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
1e4b0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
1e4e0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
1e4f0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e510 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1e520 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1e530 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1e560 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1e570 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1e580 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1e590 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1e5a0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1e5b0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1e5c0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1e5d0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5f0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1e600 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1e610 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1e620 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1e630 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1e640 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1e650 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1e660 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1e670 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1e680 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1e690 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1e6a0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1e6b0 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1e6c0 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1e6d0 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1e6e0 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1e6f0 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1e700 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1e710 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1e720 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1e730 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1e740 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1e750 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1e760 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1e770 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1e780 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1e790 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1e7a0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1e7b0 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1e7c0 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1e7d0 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1e7e0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1e7f0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1e800 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1e810 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1e820 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1e830 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1e840 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1e850 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1e860 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1e870 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1e880 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1e890 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1e8a0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1e8b0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1e8c0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1e8d0 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1e8e0 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 28  EVER(wrFlag && (
1e8f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1e900 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1e910 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1e920 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1e930 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 72 46 6c  ;.  }.  if( wrFl
1e940 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
1e950 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
1e960 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
1e970 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
1e980 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1e990 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  M;.  }.  if( iTa
1e9a0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
1e9b0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
1e9c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e9d0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
1e9e0 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
1e9f0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
1ea00 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
1ea10 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
1ea20 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
1ea30 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
1ea40 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
1ea50 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
1ea60 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
1ea70 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
1ea80 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
1ea90 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
1eaa0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
1eab0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
1eac0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
1ead0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
1eae0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
1eaf0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
1eb00 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d  ag==0 || wrFlag=
1eb10 3d 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20  =BTCF_WriteFlag 
1eb20 29 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  );.  pCur->curFl
1eb30 61 67 73 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20  ags = wrFlag;.  
1eb40 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1eb50 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1eb60 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1eb70 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1eb80 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1eb90 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1eba0 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1ebb0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1ebc0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65  OR_INVALID;.  re
1ebd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ebe0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1ebf0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
1ec00 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1ec30 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1ec40 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1ec70 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1ec80 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1ec90 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecb0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1ecc0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1ecd0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1ece0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1ed10 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
1ed20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ed50 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
1ed60 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1ed70 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1ed80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ed90 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
1eda0 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
1edb0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1edc0 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
1edd0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1ede0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1edf0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1ee00 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
1ee10 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
1ee20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
1ee30 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
1ee40 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
1ee50 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
1ee60 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
1ee70 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
1ee80 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
1ee90 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
1eea0 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
1eeb0 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
1eec0 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
1eed0 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
1eee0 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
1eef0 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
1ef00 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
1ef10 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1ef20 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
1ef30 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
1ef40 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
1ef50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1ef60 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
1ef70 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
1ef80 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
1ef90 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
1efa0 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
1efb0 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
1efc0 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
1efd0 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
1efe0 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
1eff0 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
1f000 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
1f010 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
1f020 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
1f030 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
1f040 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
1f050 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
1f060 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
1f070 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
1f080 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
1f090 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
1f0a0 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
1f0b0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
1f0c0 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
1f0d0 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
1f0e0 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
1f0f0 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
1f100 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
1f110 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
1f120 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1f130 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f140 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
1f150 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
1f160 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
1f170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f180 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
1f190 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1f1a0 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
1f1b0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
1f1c0 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
1f1d0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
1f1e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1f1f0 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
1f200 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f210 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
1f220 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1f230 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 69  sor(pCur);.    i
1f240 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
1f250 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
1f260 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
1f270 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
1f280 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
1f290 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
1f2a0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
1f2b0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
1f2c0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1f2d0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
1f2e0 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
1f2f0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1f300 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
1f310 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1f320 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1f330 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
1f340 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1f350 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1f360 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
1f370 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72 2d  Btree->db, pCur-
1f380 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >aOverflow);.   
1f390 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
1f3a0 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
1f3b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f3c0 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1f3d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f3e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1f3f0 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1f400 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1f410 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1f420 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1f430 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1f440 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1f450 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1f460 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
1f470 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
1f480 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
1f490 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
1f4a0 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
1f4b0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
1f4c0 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
1f4d0 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
1f4e0 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
1f4f0 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
1f500 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1f510 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
1f520 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
1f530 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
1f540 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
1f550 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
1f560 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
1f570 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
1f580 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
1f590 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
1f5a0 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
1f5b0 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
1f5c0 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
1f5d0 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
1f5e0 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
1f5f0 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
1f600 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
1f610 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
1f620 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
1f630 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
1f640 64 6f 69 6e 67 20 61 67 67 72 65 73 73 69 76 65  doing aggressive
1f650 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
1f660 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
1f670 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
1f680 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
1f690 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
1f6a0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
1f6b0 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
1f6c0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
1f6d0 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
1f6e0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1f6f0 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
1f700 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
1f710 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1f720 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
1f730 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
1f740 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
1f750 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1f760 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
1f770 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1f780 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
1f790 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
1f7a0 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
1f7b0 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
1f7c0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
1f7d0 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
1f7e0 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
1f7f0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
1f800 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
1f810 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
1f820 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
1f830 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
1f840 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
1f850 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
1f860 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
1f870 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1f880 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
1f890 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1f8a0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1f8b0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1f8c0 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
1f8d0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1f8e0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1f8f0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1f900 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1f910 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
1f920 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
1f930 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NKey;.    }else{
1f940 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
1f950 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1f960 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
1f970 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
1f980 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
1f990 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
1f9a0 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
1f9b0 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
1f9c0 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
1f9d0 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
1f9e0 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1fa20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1fa30 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fa70 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1fa80 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fac0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
1fad0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1fae0 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1faf0 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1fb00 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20  ->info);        
1fb10 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  \.    pCur->curF
1fb20 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
1fb30 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  idNKey;         
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1fbc0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc00 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1fc10 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1fc20 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
1fc30 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
1fc40 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
1fc50 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
1fc60 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
1fc70 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1fc80 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
1fc90 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
1fca0 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
1fcb0 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
1fcc0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
1fcd0 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
1fce0 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
1fcf0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
1fd00 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
1fd10 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
1fd20 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
1fd30 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
1fd40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1fd50 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
1fd60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1fd70 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
1fd80 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
1fd90 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
1fda0 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
1fdb0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
1fdc0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
1fdd0 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1fde0 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
1fdf0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
1fe00 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
1fe10 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
1fe20 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1fe30 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
1fe40 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1fe50 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
1fe60 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
1fe70 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
1fe80 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
1fe90 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1fea0 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
1feb0 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
1fec0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1fed0 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
1fee0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
1fef0 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
1ff00 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
1ff10 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
1ff20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
1ff30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1ff40 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
1ff50 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
1ff60 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
1ff70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1ff80 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1ff90 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
1ffa0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1ffb0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1ffc0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1ffd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1ffe0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
1fff0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20000 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
20010 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
20020 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
20030 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30  {.    *pSize = 0
20040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67  ;.  }else{.    g
20050 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
20060 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70  ;.    *pSize = p
20070 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
20080 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20090 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
200a0 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
200b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
200c0 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
200d0 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
200e0 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
200f0 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a  points to..**.**
20100 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
20110 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
20120 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
20130 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
20140 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
20150 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
20160 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
20170 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
20180 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
20190 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
201a0 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
201b0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
201c0 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20  *.** Failure is 
201d0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54  not possible.  T
201e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
201f0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
20200 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67  TE_OK..** It mig
20210 68 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20  ht just as well 
20220 62 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28  be a procedure (
20230 72 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20  returning void) 
20240 62 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a  but we continue.
20250 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ** to return an 
20260 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63  integer result c
20270 6f 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ode for historic
20280 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69  al reasons..*/.i
20290 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
202a0 61 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ataSize(BtCursor
202b0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69   *pCur, u32 *pSi
202c0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
202d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
202e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
202f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20300 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20310 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
20320 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20330 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  age]->intKeyLeaf
20340 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  ==1 );.  getCell
20350 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
20360 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
20370 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  o.nPayload;.  re
20380 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20390 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
203a0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
203b0 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
203c0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
203d0 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
203e0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
203f0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
20400 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
20410 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
20420 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
20430 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
20440 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
20450 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
20460 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
20470 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
20480 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
20490 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
204a0 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
204b0 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
204c0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
204d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
204e0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
204f0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
20500 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
20510 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
20520 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
20530 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
20540 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
20550 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
20560 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
20570 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
20580 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
20590 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
205a0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
205b0 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
205c0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
205d0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
205e0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
205f0 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
20600 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
20610 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
20620 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
20630 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
20640 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
20650 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
20660 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
20670 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
20680 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
20690 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
206a0 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
206b0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
206c0 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
206d0 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
206e0 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
206f0 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
20700 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
20710 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
20720 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
20730 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
20740 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
20750 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
20760 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
20770 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
20780 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
20790 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
207a0 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
207b0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
207c0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
207d0 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d   number */.  Mem
207e0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
207f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
20800 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65  : MemPage handle
20810 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a   (may be NULL) *
20820 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
20830 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
20840 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
20850 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
20860 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
20870 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  next = 0;.  MemP
20880 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
20890 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
208a0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
208b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
208c0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
208d0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e  );.  assert(pPgn
208e0 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66  oNext);..#ifndef
208f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20900 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79  OVACUUM.  /* Try
20910 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78   to find the nex
20920 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
20930 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e  erflow list usin
20940 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76  g the.  ** autov
20950 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61  acuum pointer-ma
20960 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74  p pages. Guess t
20970 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67  hat the next pag
20980 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f  e in .  ** the o
20990 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20  verflow list is 
209a0 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66  page number (ovf
209b0 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75  l+1). If that gu
209c0 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20  ess turns .  ** 
209d0 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c  out to be wrong,
209e0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f   fall back to lo
209f0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f  ading the data o
20a00 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d  f page .  ** num
20a10 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65  ber ovfl to dete
20a20 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70  rmine the next p
20a30 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f  age number..  */
20a40 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
20a50 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
20a60 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e  no pgno;.    Pgn
20a70 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b  o iGuess = ovfl+
20a80 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  1;.    u8 eType;
20a90 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52  ..    while( PTR
20aa0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
20ab0 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73  iGuess) || iGues
20ac0 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  s==PENDING_BYTE_
20ad0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
20ae0 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20     iGuess++;.   
20af0 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65   }..    if( iGue
20b00 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75  ss<=btreePagecou
20b10 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
20b20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
20b30 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54  pBt, iGuess, &eT
20b40 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20  ype, &pgno);.   
20b50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20b60 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50  E_OK && eType==P
20b70 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
20b80 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b  && pgno==ovfl ){
20b90 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20  .        next = 
20ba0 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20  iGuess;.        
20bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
20bc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20bd0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
20be0 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c  sert( next==0 ||
20bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
20c00 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
20c10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
20c20 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
20c30 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
20c40 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20  ge, (ppPage==0) 
20c50 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
20c60 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61  ONLY : 0);.    a
20c70 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
20c80 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
20c90 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
20ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20cb0 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
20cc0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
20cd0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
20ce0 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
20cf0 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
20d00 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
20d10 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
20d20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20d30 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
20d40 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
20d50 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
20d60 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
20d70 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
20d80 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
20d90 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
20da0 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
20db0 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
20dc0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
20dd0 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
20de0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
20df0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
20e00 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
20e10 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
20e20 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
20e30 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
20e40 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
20e50 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
20e60 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
20e70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
20e80 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
20e90 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
20ea0 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
20eb0 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
20ec0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
20ed0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
20ee0 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
20ef0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
20f00 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
20f10 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
20f20 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
20f30 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
20f40 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
20f50 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
20f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
20f70 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
20f80 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
20f90 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
20fa0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
20fb0 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
20fc0 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
20fd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20fe0 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
20ff0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
21020 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
21030 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
21040 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
21050 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
21060 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
21070 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
21080 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
21090 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
210a0 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
210b0 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
210c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
210d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
210e0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
210f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21100 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
21110 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
21120 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
21130 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
21140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
21150 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
21160 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
21170 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
21180 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
21190 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
211a0 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
211b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
211c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
211d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
211e0 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
211f0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
21200 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
21210 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
21220 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
21230 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65  pointing to. The
21240 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   eOp.** argument
21250 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
21260 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
21270 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61  *   0: The opera
21280 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
21290 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
212a0 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
212b0 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69    1: The operati
212c0 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50  on is a write. P
212d0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
212e0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
212f0 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   2: The operatio
21300 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20  n is a read. Do 
21310 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65  not populate the
21320 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
21330 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
21340 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
21350 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
21360 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
21370 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
21380 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
21390 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
213a0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
213b0 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
213c0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
213d0 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
213e0 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
213f0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
21400 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
21410 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
21420 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
21430 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
21440 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
21450 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
21460 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61  and the.** eOp a
21470 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32  rgument is not 2
21480 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
21490 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
214a0 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
214b0 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20  y .** populates 
214c0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
214d0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
214e0 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
214f0 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
21500 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
21510 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
21520 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
21530 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
21540 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
21550 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
21560 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
21570 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
21580 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
21590 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
215a0 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
215b0 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
215c0 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
215d0 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
215e0 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
215f0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
21600 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
21610 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
21620 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
21630 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
21640 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
21650 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
21660 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
21670 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
21680 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
21690 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
216a0 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
216b0 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
216c0 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
216d0 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
216e0 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
216f0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
21700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
21710 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
21720 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
21730 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
21740 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
21750 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
21760 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
21770 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
21780 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
21790 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
217a0 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
217b0 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
217c0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
217d0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
217e0 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
217f0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
21800 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
21810 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
21820 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
21830 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
21840 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
21850 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
21860 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
21870 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
21880 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
21890 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
218a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
218b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
218c0 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
218d0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
218e0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
218f0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
21920 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
21930 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
21940 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
21950 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
21960 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
21970 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
21980 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20  .  int bEnd;    
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
219b0 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67 20  True if reading 
219c0 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a  to end of data *
219d0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
219e0 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
219f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
21a00 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21a10 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
21a20 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
21a30 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
21a40 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
21a50 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21a60 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21a70 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20  sert( eOp!=2 || 
21a80 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20  offset==0 );    
21a90 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74 20  /* Always start 
21aa0 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66  from beginning f
21ab0 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20  or eOp==2 */..  
21ac0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
21ad0 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
21ae0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
21af0 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  oad;.#ifdef SQLI
21b00 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
21b10 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d  OW_READ.  bEnd =
21b20 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75   offset+amt==pCu
21b30 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
21b40 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
21b50 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  t( offset+amt <=
21b60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
21b70 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26  load );..  if( &
21b80 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
21b90 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
21ba0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
21bb0 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a  >usableSize] ){.
21bc0 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f      /* Trying to
21bd0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70   read or write p
21be0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
21bf0 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72  he data is an er
21c00 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ror */.    retur
21c10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21c20 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
21c30 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
21c40 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
21c50 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
21c60 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
21c70 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
21c80 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
21c90 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
21ca0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
21cb0 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
21cc0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
21cd0 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
21ce0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
21cf0 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
21d00 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
21d10 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
21d20 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
21d30 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d   & 0x01), pPage-
21d40 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
21d50 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
21d60 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
21d70 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
21d80 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
21d90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
21da0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
21db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
21dc0 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
21dd0 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
21de0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
21df0 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
21e00 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
21e10 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
21e20 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
21e30 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
21e40 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
21e50 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
21e60 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
21e70 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
21e80 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
21e90 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
21ea0 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
21eb0 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64      ** Except, d
21ec0 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61  o not allocate a
21ed0 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65  Overflow[] for e
21ee0 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  Op==2..    **.  
21ef0 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c    ** The aOverfl
21f00 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69  ow[] array is si
21f10 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79  zed at one entry
21f20 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
21f30 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69  ow page.    ** i
21f40 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  n the overflow c
21f50 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e  hain. The page n
21f60 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
21f70 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
21f80 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65   is.    ** store
21f90 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30  d in aOverflow[0
21fa0 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ], etc. A value 
21fb0 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
21fc0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20  rflow[] array.  
21fd0 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20    ** means "not 
21fe0 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20  yet known" (the 
21ff0 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
22000 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
22010 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d  */.    if( eOp!=
22020 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  2 && (pCur->curF
22030 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
22040 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  dOvfl)==0 ){.   
22050 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
22060 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
22070 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
22080 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
22090 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
220a0 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72    if( nOvfl>pCur
220b0 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a  ->nOvflAlloc ){.
220c0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e          Pgno *aN
220d0 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69  ew = (Pgno*)sqli
220e0 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 0a 20 20  te3DbRealloc(.  
220f0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
22100 70 42 74 72 65 65 2d 3e 64 62 2c 20 70 43 75 72  pBtree->db, pCur
22110 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76  ->aOverflow, nOv
22120 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  fl*2*sizeof(Pgno
22130 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
22140 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
22150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
22160 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
22170 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
22180 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
22190 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76  nOvflAlloc = nOv
221a0 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  fl*2;.          
221b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
221c0 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
221d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
221e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
221f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  K ){.        mem
22200 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
22210 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
22220 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
22230 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
22240 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
22250 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  dOvfl;.      }. 
22260 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
22270 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
22280 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
22290 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
222a0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
222b0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
222c0 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
222d0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
222e0 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
222f0 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
22300 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
22310 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
22320 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
22330 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72  !=0.     && pCur
22340 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
22350 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20  et/ovflSize].   
22360 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
22370 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
22380 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
22390 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
223a0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
223b0 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
223c0 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
223d0 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20    }..    for( ; 
223e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
223f0 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
22400 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20  ge; iIdx++){..  
22410 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
22420 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
22430 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
22440 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
22450 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
22460 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
22470 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a  alidOvfl)!=0 ){.
22480 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
22490 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
224a0 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
224b0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
224c0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
224d0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
224e0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
224f0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
22500 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
22510 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
22520 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
22530 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
22540 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
22550 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
22560 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
22570 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
22580 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
22590 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
225a0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
225b0 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
225c0 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
225d0 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
225e0 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
225f0 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
22600 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
22610 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
22620 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
22630 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
22640 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
22650 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
22660 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76  ote that the aOv
22670 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
22680 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
22690 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a   because eOp!=2.
226a0 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e          ** here.
226b0 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65    If eOp==2, the
226c0 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20  n offset==0 and 
226d0 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e  this branch is n
226e0 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20  ever taken..    
226f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
22700 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b  ssert( eOp!=2 );
22710 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
22720 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
22730 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
22740 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
22750 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
22760 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
22770 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
22780 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
22790 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
227a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
227b0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
227c0 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
227d0 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
227e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
227f0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
22800 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
22810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22820 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
22830 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
22840 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
22850 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
22860 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
22870 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
22880 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
22890 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
228a0 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
228b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
228c0 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
228d0 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
228e0 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
228f0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
22900 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
22910 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
22920 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
22930 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
22940 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
22950 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
22960 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
22970 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
22980 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
22990 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
229a0 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
229b0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
229c0 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
229d0 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
229e0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
229f0 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
22a00 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
22a10 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
22a20 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
22a30 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
22a40 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
22a50 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
22a60 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
22a70 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
22a80 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
22a90 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
22aa0 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
22ab0 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
22ac0 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
22ad0 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61    **   6) all da
22ae0 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ta from the page
22af0 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a   is being read..
22b00 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20          **   7) 
22b10 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
22b20 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
22b30 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65  en read into the
22b40 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a   output buffer .
22b50 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
22b60 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20     ** then data 
22b70 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
22b80 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
22b90 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f  tabase file into
22ba0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
22bb0 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62  output buffer, b
22bc0 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67  ypassing the pag
22bd0 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68  e-cache altogeth
22be0 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a  er. This speeds.
22bf0 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f          ** up lo
22c00 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f  ading large reco
22c10 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61  rds that span ma
22c20 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
22c30 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
22c40 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30        if( (eOp&0
22c50 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20  x01)==0         
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22c80 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
22c90 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20  && offset==0    
22ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
22cd0 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e           && (bEn
22ce0 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65  d || a==ovflSize
22cf0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22d10 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
22d20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
22d30 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
22d40 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
22d50 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a          /* (4) *
22d60 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
22d70 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
22d80 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
22d90 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
22da0 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
22db0 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67      && pBt->pPag
22dc0 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30  e1->aData[19]==0
22dd0 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20  x01             
22de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29            /* (5)
22df0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
22e00 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
22e10 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20     /* (7) */.   
22e40 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
22e50 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
22e60 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
22e70 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
22e80 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
22e90 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
22ea0 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a  /* hence (7) */.
22ed0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
22ee0 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
22ef0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
22f00 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
22f10 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
22f20 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65  , (i64)pBt->page
22f30 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31  Size*(nextPage-1
22f40 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
22f50 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
22f60 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
22f70 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
22f80 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
22f90 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
22fa0 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
22fb0 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
22fc0 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
22fd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22fe0 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
22ff0 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
23000 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20  ge, &pDbPage,.  
23010 20 20 20 20 20 20 20 20 20 20 20 20 28 28 65 4f              ((eO
23020 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47  p&0x01)==0 ? PAG
23030 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
23040 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
23050 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
23060 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23070 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
23080 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
23090 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
230a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
230b0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
230c0 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
230d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
230e0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
230f0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
23100 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70  ], pBuf, a, (eOp
23110 26 30 78 30 31 29 2c 20 70 44 62 50 61 67 65 29  &0x01), pDbPage)
23120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
23130 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
23140 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
23150 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
23160 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23180 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
23190 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
231a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
231b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
231c0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
231d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
231e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
231f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
23210 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
23220 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
23230 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
23240 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
23250 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
23260 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75  sferred into pBu
23270 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
23280 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
23290 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
232a0 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
232b0 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72  ensure that pCur
232c0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
232d0 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69  a valid row.** i
232e0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
232f0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
23300 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
23310 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
23320 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
23330 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
23340 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
23350 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
23360 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
23370 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
23380 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
23390 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
233a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
233b0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
233c0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
233d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
233e0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
233f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
23400 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23410 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
23420 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
23430 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
23440 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23450 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
23460 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
23470 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
23480 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23490 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
234a0 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
234b0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
234c0 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e  et, amt, (unsign
234d0 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30  ed char*)pBuf, 0
234e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
234f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
23500 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
23510 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
23520 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
23530 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
23540 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
23550 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
23560 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
23570 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
23580 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
23590 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
235a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
235b0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
235c0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
235d0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
235e0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
235f0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
23600 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
23610 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
23620 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
23630 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23640 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
23650 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
23660 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
23670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23680 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
23690 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
236a0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
236b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
236c0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
236d0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
236e0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
236f0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
23700 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
23710 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
23720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23730 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
23740 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23750 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23760 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
23770 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
23780 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23790 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
237a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
237b0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
237c0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
237d0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
237e0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
237f0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
23800 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
23810 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
23820 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23830 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
23840 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
23850 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
23860 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
23870 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
23880 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
23890 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
238a0 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
238b0 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
238c0 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73   if index btrees
238d0 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
238e0 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64  =0) and is the d
238f0 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65  ata for.** table
23900 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
23910 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20  intKey==1). The 
23920 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
23930 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  of available.** 
23940 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
23950 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  ten into *pAmt. 
23960 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
23970 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  en the value.** 
23980 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
23990 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69  t be a valid poi
239a0 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
239b0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
239c0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
239d0 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
239e0 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
239f0 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
23a00 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
23a10 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
23a20 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
23a30 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
23a40 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
23a50 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
23a60 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
23a70 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
23a80 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
23a90 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
23aa0 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
23ab0 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
23ac0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
23ad0 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
23ae0 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
23af0 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
23b00 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
23b10 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
23b20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
23b30 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
23b40 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
23b50 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
23b60 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
23b70 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
23b80 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
23b90 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
23ba0 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
23bb0 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
23bc0 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
23bd0 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
23be0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
23bf0 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64  tatic const void
23c00 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
23c10 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
23c20 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
23c30 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
23c40 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
23c50 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20  */.  u32 *pAmt  
23c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
23c70 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
23c80 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
23c90 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73   here */.){.  as
23ca0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
23cb0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
23cc0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
23cd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
23ce0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23cf0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23d00 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
23d10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23d20 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
23d30 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
23d40 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
23d50 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
23d60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23d70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23d80 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
23d90 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23da0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
23db0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
23dc0 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 2a 70 41  nSize>0 );.  *pA
23dd0 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
23de0 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e  nLocal;.  return
23df0 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
23e00 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
23e10 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
23e20 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
23e30 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
23e40 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
23e50 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
23e60 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
23e70 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
23e80 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
23e90 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
23ea0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
23eb0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
23ec0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
23ed0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
23ee0 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
23ef0 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
23f00 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
23f10 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
23f20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
23f30 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
23f40 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
23f50 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
23f60 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
23f70 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
23f80 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
23f90 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
23fa0 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
23fb0 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
23fc0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
23fd0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
23fe0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
23ff0 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
24000 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
24010 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
24020 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
24030 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
24040 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
24050 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
24060 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
24070 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
24080 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
24090 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
240a0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
240b0 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64  t);.}.const void
240c0 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
240d0 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
240e0 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
240f0 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
24100 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
24110 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
24120 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
24130 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
24140 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
24150 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
24160 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
24170 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
24180 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
24190 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
241a0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
241b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
241c0 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
241d0 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
241e0 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
241f0 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
24200 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
24210 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
24220 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
24230 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
24240 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
24250 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
24260 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
24270 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
24280 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24290 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
242a0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
242b0 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  newPgno){.  int 
242c0 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43  rc;.  int i = pC
242d0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d  ur->iPage;.  Mem
242e0 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a  Page *pNewPage;.
242f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
24300 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
24310 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24320 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
24330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24340 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
24350 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
24360 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
24370 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
24380 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
24390 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
243a0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
243b0 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
243c0 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
243d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
243e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
243f0 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
24400 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
24410 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
24420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24430 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
24440 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
24450 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  g)==0 ? PAGER_GE
24460 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
24470 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
24480 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
24490 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
244a0 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
244b0 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
244c0 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
244d0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
244e0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
244f0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
24500 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
24510 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
24520 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
24530 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61  Cell<1 || pNewPa
24540 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  ge->intKey!=pCur
24550 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74  ->apPage[i]->int
24560 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
24570 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
24580 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
24590 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
245a0 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61  ..#if 0./*.** Pa
245b0 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e  ge pParent is an
245c0 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c   internal (non-l
245d0 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20  eaf) tree page. 
245e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
245f0 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70  * asserts that p
24600 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
24610 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68  d is the left-ch
24620 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27  ild if the iIdx'
24630 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61  th.** cell in pa
24640 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20  ge pParent. Or, 
24650 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c  if iIdx is equal
24660 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   to the total nu
24670 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73  mber of.** cells
24680 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61   in pParent, tha
24690 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43  t page number iC
246a0 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68  hild is the righ
246b0 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68  t-child of.** th
246c0 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
246d0 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72  c void assertPar
246e0 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65  entIndex(MemPage
246f0 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69   *pParent, int i
24700 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64  Idx, Pgno iChild
24710 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  ){.  assert( iId
24720 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
24730 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
24740 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
24750 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
24760 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
24770 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
24780 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
24790 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
247a0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
247b0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
247c0 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
247d0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
247e0 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
247f0 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
24800 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
24810 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
24820 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
24830 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
24840 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
24850 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
24860 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
24870 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
24880 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
24890 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
248a0 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
248b0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
248c0 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
248d0 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
248e0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
248f0 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
24900 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
24910 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
24920 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
24930 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
24940 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
24950 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
24960 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
24970 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24980 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24990 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
249a0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
249b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
249c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
249d0 61 67 65 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50  age] );..  /* UP
249e0 44 41 54 45 3a 20 49 74 20 69 73 20 61 63 74 75  DATE: It is actu
249f0 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 66 6f  ally possible fo
24a00 72 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  r the condition 
24a10 74 65 73 74 65 64 20 62 79 20 74 68 65 20 61 73  tested by the as
24a20 73 65 72 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20  sert.  ** below 
24a30 74 6f 20 62 65 20 75 6e 74 72 75 65 20 69 66 20  to be untrue if 
24a40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24a50 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 54 68  e is corrupt. Th
24a60 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66 0a  is can occur if.
24a70 20 20 2a 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20    ** one cursor 
24a80 68 61 73 20 6d 6f 64 69 66 69 65 64 20 70 61 67  has modified pag
24a90 65 20 70 50 61 72 65 6e 74 20 77 68 69 6c 65 20  e pParent while 
24aa0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
24ab0 74 20 69 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20  t is held .  ** 
24ac0 62 79 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  by a second curs
24ad0 6f 72 2e 20 57 68 69 63 68 20 63 61 6e 20 6f 6e  or. Which can on
24ae0 6c 79 20 68 61 70 70 65 6e 20 69 66 20 61 20 73  ly happen if a s
24af0 69 6e 67 6c 65 20 70 61 67 65 20 69 73 20 6c 69  ingle page is li
24b00 6e 6b 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d  nked.  ** into m
24b10 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
24b20 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 6e  ree structure in
24b30 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
24b40 61 73 65 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ase.  */.#if 0. 
24b50 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
24b60 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
24b70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24b80 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
24b90 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24ba0 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
24bb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
24bc0 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
24bd0 23 65 6e 64 69 66 0a 20 20 74 65 73 74 63 61 73  #endif.  testcas
24be0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
24bf0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
24c00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
24c10 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
24c20 6c 6c 20 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65  ll );..  release
24c30 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
24c40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
24c50 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
24c60 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
24c70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
24c80 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
24c90 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
24ca0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
24cb0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
24cc0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
24cd0 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  t to the root pa
24ce0 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65  ge of its b-tree
24cf0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
24d00 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
24d10 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f  as a virtual roo
24d20 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  t page, then the
24d30 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
24d40 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20   to point.** to 
24d50 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  the virtual root
24d60 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66   page instead of
24d70 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
24d80 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68   page. A table h
24d90 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20  as a.** virtual 
24da0 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74  root page when t
24db0 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
24dc0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
24dd0 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20  cells and a .** 
24de0 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67  single child pag
24df0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
24e00 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65   happen with the
24e10 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74   table rooted at
24e20 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49   page 1..**.** I
24e30 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72  f the b-tree str
24e40 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c  ucture is empty,
24e50 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
24e60 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20  e is set to .** 
24e70 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20  CURSOR_INVALID. 
24e80 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63  Otherwise, the c
24e90 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
24ea0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
24eb0 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74  st.** cell locat
24ec0 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28  ed on the root (
24ed0 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
24ee0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
24ef0 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73  rsor state.** is
24f00 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56   set to CURSOR_V
24f10 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ALID..**.** If t
24f20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
24f30 75 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c  urns successfull
24f40 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73  y, it may be ass
24f50 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a  umed that the.**
24f60 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
24f70 67 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  gs indicate that
24f80 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72   the [virtual] r
24f90 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20  oot-page is the 
24fa0 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e  expected .** kin
24fb0 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  d of b-tree page
24fc0 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f   (i.e. if when o
24fd0 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  pening the curso
24fe0 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64  r the caller did
24ff0 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20   not.** specify 
25000 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74  a KeyInfo struct
25010 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ure the flags by
25020 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30  te is set to 0x0
25030 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e  5 or 0x0D,.** in
25040 64 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65  dicating a table
25050 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74   b-tree, or if t
25060 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70  he caller did sp
25070 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20  ecify a KeyInfo 
25080 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68  .** structure th
25090 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
250a0 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30  set to 0x02 or 0
250b0 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  x0A, indicating 
250c0 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72  an index.** b-tr
250d0 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ee)..*/.static i
250e0 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74  nt moveToRoot(Bt
250f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25100 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
25110 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25120 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
25130 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25140 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25150 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
25160 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
25170 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
25180 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
25190 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
251a0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
251b0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
251c0 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
251d0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
251e0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
251f0 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
25200 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
25210 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25220 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
25230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
25240 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
25250 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
25260 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
25270 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
25280 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
25290 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
252a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
252b0 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
252c0 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50   while( pCur->iP
252d0 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
252e0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
252f0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a  Cur->iPage--]);.
25300 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
25310 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
25320 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
25330 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
25340 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
25350 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
25360 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  e{.    rc = getA
25370 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d  ndInitPage(pCur-
25380 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43  >pBtree->pBt, pC
25390 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
253a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a  Cur->apPage[0],.
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253c0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
253d0 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   & BTCF_WriteFla
253e0 67 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  g)==0 ? PAGER_GE
253f0 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
25400 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25420 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
25430 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
25440 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
25450 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
25460 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  iPage = 0;.  }. 
25470 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
25480 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
25490 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
254a0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
254b0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
254c0 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
254d0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
254e0 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
254f0 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
25500 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
25510 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
25520 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
25530 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
25540 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
25550 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
25560 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
25570 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
25580 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
25590 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
255a0 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
255b0 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
255c0 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
255d0 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
255e0 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
255f0 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
25600 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
25610 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
25620 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
25630 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
25640 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
25650 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
25660 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
25670 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
25680 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
25690 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
256a0 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
256b0 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
256c0 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
256d0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
256e0 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
256f0 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
25700 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
25710 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
25720 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
25730 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
25740 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
25750 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
25760 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
25770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25780 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
25790 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
257a0 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
257b0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
257c0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
257d0 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
257e0 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
257f0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
25800 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
25810 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
25820 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
25830 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
25840 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
25850 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
25860 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
25870 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
25880 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
25890 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
258a0 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
258b0 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
258c0 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
258d0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
258e0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
258f0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
25900 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
25910 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
25920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
25930 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
25940 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a  OR_INVALID;.  }.
25950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25960 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
25970 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
25980 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
25990 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
259a0 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
259b0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
259c0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
259d0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
259e0 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
259f0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
25a00 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
25a10 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
25a20 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
25a30 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
25a40 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
25a50 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
25a60 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
25a70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
25a80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
25a90 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25aa0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25ac0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25ad0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
25ae0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
25af0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
25b00 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25b10 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
25b20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
25b30 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25b40 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
25b50 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
25b60 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
25b70 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
25b80 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
25b90 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
25ba0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
25bb0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
25bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
25bd0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
25be0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
25bf0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
25c00 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
25c10 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
25c20 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
25c30 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
25c40 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
25c50 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
25c60 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
25c70 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
25c80 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
25c90 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
25ca0 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
25cb0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
25cc0 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
25cd0 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
25ce0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
25cf0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
25d00 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
25d10 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
25d20 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
25d30 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
25d40 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
25d50 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
25d60 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
25d70 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
25d80 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
25d90 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
25da0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
25db0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
25dc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
25dd0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
25de0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25df0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25e00 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
25e10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25e20 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
25e30 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20  hile( !(pPage = 
25e40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25e50 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
25e60 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
25e70 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
25e80 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
25e90 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
25ea0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
25eb0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
25ec0 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
25ed0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
25ee0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
25ef0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
25f00 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
25f10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25f20 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
25f30 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  -1;.  assert( pC
25f40 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
25f50 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
25f60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25f70 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
25f80 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
25f90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
25fa0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
25fb0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
25fc0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
25fd0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
25fe0 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
25ff0 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
26000 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
26010 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
26020 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
26030 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
26040 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
26050 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
26060 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
26070 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
26080 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
26090 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
260a0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
260b0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
260c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
260d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
260e0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
260f0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
26100 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
26110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26120 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
26130 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26140 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
26150 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
26160 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
26170 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
26180 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
26190 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
261a0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65  pRes = 1;.    }e
261b0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
261c0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
261d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
261e0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
261f0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
26200 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
26210 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
26220 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26230 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
26240 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
26250 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
26260 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
26270 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
26280 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
26290 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
262a0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
262b0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
262c0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
262d0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
262e0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
262f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
26300 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
26310 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
26320 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
26330 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26340 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
26360 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
26370 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
26380 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
26390 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
263a0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
263b0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
263c0 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
263d0 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
263e0 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
263f0 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
26400 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26410 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
26420 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
26430 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
26440 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
26450 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
26460 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
26470 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
26480 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
26490 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
264a0 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
264b0 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
264c0 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
264d0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
264e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
264f0 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
26500 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
26510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
26520 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
26530 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
26540 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
26550 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
26560 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26570 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26580 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
26590 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
265a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
265b0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
265c0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
265d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
265e0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
265f0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
26600 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
26610 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
26620 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
26630 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26640 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
26650 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
26660 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
26670 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
26680 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
26690 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
266a0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
266b0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
266c0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
266d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
266e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
266f0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
26700 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61  ags |= BTCF_AtLa
26710 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  st;.      }else{
26720 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
26730 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
26740 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
26750 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .   .    }.  }. 
26760 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26770 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
26780 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
26790 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
267a0 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
267b0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
267c0 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
267d0 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
267e0 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
267f0 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
26800 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
26810 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
26820 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
26830 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
26840 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
26850 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
26860 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
26870 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
26880 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
26890 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
268a0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
268b0 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
268c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
268d0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
268e0 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
268f0 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
26900 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
26910 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
26920 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
26930 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
26940 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
26950 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
26960 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
26970 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
26980 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
26990 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
269a0 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
269b0 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
269c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
269d0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
269e0 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
269f0 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
26a00 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
26a10 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
26a20 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
26a30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
26a40 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
26a50 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
26a60 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
26a70 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
26a80 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
26a90 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
26aa0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ac0 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
26ad0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
26ae0 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
26af0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
26b00 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
26b10 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
26b20 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
26b30 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
26b50 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
26b60 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
26b70 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
26b80 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
26b90 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
26ba0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
26bb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
26bc0 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
26bd0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
26be0 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
26bf0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
26c00 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
26c10 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
26c20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
26c30 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
26c40 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
26c50 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
26c60 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
26c70 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
26c80 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
26c90 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
26ca0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
26cb0 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
26cc0 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
26cd0 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
26ce0 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
26cf0 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
26d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
26d10 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
26d20 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
26d30 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43  nt rc;.  RecordC
26d40 6f 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f  ompare xRecordCo
26d50 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74  mpare;..  assert
26d60 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
26d70 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
26d80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
26d90 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
26da0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
26db0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
26dc0 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
26dd0 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
26de0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
26df0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
26e00 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
26e10 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
26e20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
26e30 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
26e40 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
26e50 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
26e60 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
26e70 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
26e80 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
26e90 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72  R_VALID && (pCur
26ea0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26eb0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a  F_ValidNKey)!=0.
26ec0 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
26ed0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
26ee0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
26ef0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
26f00 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
26f10 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
26f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26f30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70      }.    if( (p
26f40 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
26f50 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20  BTCF_AtLast)!=0 
26f60 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
26f70 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
26f80 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
26f90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26fa0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
26fb0 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  ..  if( pIdxKey 
26fc0 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  ){.    xRecordCo
26fd0 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56  mpare = sqlite3V
26fe0 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70  dbeFindCompare(p
26ff0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64  IdxKey);.    pId
27000 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20  xKey->errCode = 
27010 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
27020 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
27030 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20  rc==1 .         
27040 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
27050 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20  ult_rc==0 .     
27060 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
27070 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20  default_rc==-1. 
27080 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
27090 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
270a0 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65  e = 0; /* All ke
270b0 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  ys are integers 
270c0 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  */.  }..  rc = m
270d0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
270e0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
270f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
27100 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27110 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
27120 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27130 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
27140 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
27150 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
27160 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27170 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
27180 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27190 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
271a0 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
271b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
271c0 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
271d0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
271e0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
271f0 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
27200 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
27210 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
27220 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
27230 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27240 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
27250 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27260 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
27270 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
27280 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
27290 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
272a0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
272b0 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20  upr, idx, c;.   
272c0 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
272d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
272e0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
272f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
27300 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
27310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27320 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
27330 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
27340 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
27350 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c    /* pPage->nCel
27360 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65  l must be greate
27370 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20  r than zero. If 
27380 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74  this is the root
27390 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65  -page.    ** the
273a0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61   cursor would ha
273b0 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20  ve been INVALID 
273c0 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66  above and this f
273d0 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20  or(;;) loop.    
273e0 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74  ** not run. If t
273f0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72  his is not the r
27400 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74  oot-page, then t
27410 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29  he moveToChild()
27420 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20   routine.    ** 
27430 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  would have alrea
27440 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63  dy detected db c
27450 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c  orruption. Simil
27460 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74  arly, pPage must
27470 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72  .    ** be the r
27480 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78  ight kind (index
27490 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d   or table) of b-
274a0 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72  tree page. Other
274b0 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f  wise.    ** a mo
274c0 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d  veToChild() or m
274d0 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c  oveToRoot() call
274e0 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
274f0 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e  cted corruption.
27500 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
27510 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
27520 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27530 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70  Page->intKey==(p
27540 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20  IdxKey==0) );.  
27550 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75    lwr = 0;.    u
27560 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  pr = pPage->nCel
27570 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  l-1;.    assert(
27580 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c   biasRight==0 ||
27590 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29 3b   biasRight==1 );
275a0 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e 3e  .    idx = upr>>
275b0 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20 2f  (1-biasRight); /
275c0 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67 68  * idx = biasRigh
275d0 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b 75  t ? upr : (lwr+u
275e0 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43  pr)/2; */.    pC
275f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27600 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
27610 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63 6f  x;.    if( xReco
27620 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a  rdCompare==0 ){.
27630 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20        for(;;){. 
27640 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
27650 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 65  Key;.        pCe
27660 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
27670 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67  age, idx) + pPag
27680 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
27690 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
276a0 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
276b0 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
276c0 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65  e( 0x80 <= *(pCe
276d0 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ll++) ){.       
276e0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d       if( pCell>=
276f0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
27700 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
27710 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
27720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27730 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
27740 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
27750 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
27760 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
27770 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20  Key<intKey ){.  
27780 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64          lwr = id
27790 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  x+1;.          i
277a0 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20  f( lwr>upr ){ c 
277b0 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20  = -1; break; }. 
277c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
277d0 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79   nCellKey>intKey
277e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
277f0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
27800 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
27810 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61   ){ c = +1; brea
27820 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
27830 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
27840 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d  sert( nCellKey==
27850 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
27860 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
27870 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
27880 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  NKey;.          
27890 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
278a0 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
278b0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
278c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
278d0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
278e0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
278f0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
27900 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
27910 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
27920 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79   moveto_next_lay
27930 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  er;.          }e
27940 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
27950 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
27960 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27970 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
27980 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
27990 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
279a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
279b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77        assert( lw
279c0 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20  r+upr>=0 );.    
279d0 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75      idx = (lwr+u
279e0 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20  pr)>>1;  /* idx 
279f0 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  = (lwr+upr)/2; *
27a00 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  /.      }.    }e
27a10 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  lse{.      for(;
27a20 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ;){.        int 
27a30 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  nCell;.        p
27a40 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
27a50 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
27a60 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
27a70 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  e;..        /* T
27a80 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
27a90 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
27aa0 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
27ab0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
27ac0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
27ad0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
27ae0 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
27af0 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
27b00 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
27b10 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
27b20 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
27b30 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
27b40 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
27b50 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
27b60 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
27b70 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
27b80 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
27b90 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
27ba0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
27bb0 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
27bc0 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
27bd0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
27be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
27bf0 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
27c00 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
27c10 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
27c20 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
27c30 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
27c40 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
27c50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
27c60 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
27c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
27c80 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
27c90 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
27ca0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
27cb0 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
27cc0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
27cd0 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
27ce0 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
27cf0 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
27d00 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
27d10 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
27d20 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
27d30 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
27d40 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
27d50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
27d60 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
27d70 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
27d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
27d90 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
27da0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
27db0 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
27dc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
27dd0 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
27de0 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
27df0 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
27e00 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
27e10 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
27e20 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
27e30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
27e40 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
27e50 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
27e60 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
27e70 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
27e80 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
27e90 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
27ea0 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
27eb0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
27ec0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
27ed0 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
27ee0 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
27ef0 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
27f00 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
27f10 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
27f20 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
27f30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27f40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
27f50 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
27f60 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
27f70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
27f80 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
27f90 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
27fa0 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
27fb0 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
27fc0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
27fd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
27fe0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
27ff0 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
28000 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
28010 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
28020 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
28030 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
28040 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
28050 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
28060 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
28070 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
28080 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
28090 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
280a0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
280b0 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61           btreePa
280c0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
280d0 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
280e0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
280f0 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
28100 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
28110 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
28120 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
28130 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a  alloc( nCell );.
28140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
28150 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
28160 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
28170 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
28180 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
28190 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
281a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
281b0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
281c0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
281d0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
281e0 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
281f0 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
28200 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
28210 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29  ar*)pCellKey, 2)
28220 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28230 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
28240 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
28250 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
28260 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
28270 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
28280 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28290 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
282a0 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
282b0 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
282c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
282d0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
282e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
282f0 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
28300 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d         (pIdxKey-
28310 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
28320 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30  _CORRUPT || c==0
28330 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
28340 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
28350 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
28360 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
28370 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
28380 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28390 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
283a0 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
283b0 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx+1;.        }e
283c0 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20  lse if( c>0 ){. 
283d0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
283e0 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx-1;.        }e
283f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
28400 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20  ssert( c==0 );. 
28410 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
28420 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
28430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
28440 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
28450 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
28460 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
28470 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b         if( pIdxK
28480 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63  ey->errCode ) rc
28490 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
284a0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
284b0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
284c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
284d0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
284e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
284f0 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
28500 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
28510 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
28520 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
28530 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20  +upr)/2 */.     
28540 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
28550 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
28560 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || (pPage->intKe
28570 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
28580 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  f) );.    assert
28590 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
285a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
285b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
285c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
285d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
285e0 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
285f0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
28600 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
28610 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
28620 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
28630 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
28640 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
28650 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
28660 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
28670 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
28680 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
28690 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
286a0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
286b0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
286c0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
286d0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
286e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
286f0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
28700 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
28710 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
28720 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
28730 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
28740 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
28750 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
28760 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
28770 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
28780 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
28790 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
287a0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
287b0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
287c0 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
287d0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
287e0 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  fl);.  return rc
287f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
28800 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
28810 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
28820 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
28830 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
28840 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
28850 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
28860 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
28870 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
28880 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
28890 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
288a0 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
288b0 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
288c0 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
288d0 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
288e0 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
288f0 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
28900 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
28910 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
28920 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
28930 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
28940 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
28950 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
28960 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
28970 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
28980 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
28990 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
289a0 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
289b0 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
289c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
289d0 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
289e0 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
289f0 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
28a00 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
28a10 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
28a20 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
28a30 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
28a40 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
28a50 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
28a60 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
28a70 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
28a80 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
28a90 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
28aa0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
28ab0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
28ac0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
28ad0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
28ae0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
28af0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
28b00 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  s=1..**.** The m
28b10 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
28b20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  is sqlite3BtreeN
28b30 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75  ext().  That rou
28b40 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65  tine is optimize
28b50 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d  d.** for the com
28b60 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65  mon case of mere
28b70 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20  ly incrementing 
28b80 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72  the cell counter
28b90 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a   BtCursor.aiIdx.
28ba0 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  ** to the next c
28bb0 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
28bc0 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
28bd0 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74  lower) btreeNext
28be0 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75  () helper.** rou
28bf0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
28c00 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73  hen it is necess
28c10 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61  ary to move to a
28c20 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20   different page 
28c30 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  or.** to restore
28c40 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a   the cursor..**.
28c50 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  ** The calling f
28c60 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74  unction will set
28c70 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31   *pRes to 0 or 1
28c80 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a  .  The initial *
28c90 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69  pRes value.** wi
28ca0 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63  ll be 1 if the c
28cb0 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70  ursor being step
28cc0 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ped corresponds 
28cd0 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  to an SQL index 
28ce0 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72  and.** if this r
28cf0 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76  outine could hav
28d00 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69  e been skipped i
28d10 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78  f that SQL index
28d20 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75   had been.** a u
28d30 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74  nique index.  Ot
28d40 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c  herwise the call
28d50 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74  er will have set
28d60 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a   *pRes to zero..
28d70 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63  ** Zero is the c
28d80 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20  ommon case. The 
28d90 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
28da0 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20  tion is free to 
28db0 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69  use the.** initi
28dc0 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61  al *pRes value a
28dd0 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72  s a hint to impr
28de0 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c  ove performance,
28df0 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
28e00 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65  .** SQLite btree
28e10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
28e20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20  does not. (Note 
28e30 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20  that the comdb2 
28e40 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  btree.** impleme
28e50 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65  ntation does use
28e60 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65   this hint, howe
28e70 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ver.).*/.static 
28e80 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
28e90 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74  int btreeNext(Bt
28ea0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
28eb0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
28ec0 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
28ed0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
28ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
28ef0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
28f00 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
28f10 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
28f20 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
28f30 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
28f40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  );.  assert( *pR
28f50 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  es==0 );.  if( p
28f60 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
28f70 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
28f80 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
28f90 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
28fa0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
28fb0 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
28fc0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
28fd0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
28fe0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29000 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
29010 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
29020 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
29030 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
29040 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29050 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
29060 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
29070 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
29080 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29090 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
290a0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
290b0 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
290c0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
290d0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
290e0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
290f0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
29100 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  >0 ){.        pC
29110 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
29120 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
29140 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
29150 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
29160 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
29170 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
29180 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
29190 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
291a0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
291b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
291c0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
291d0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
291e0 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
291f0 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
29200 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
29210 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
29220 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
29230 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
29240 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
29250 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
29260 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
29270 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
29280 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
29290 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
292a0 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
292b0 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
292c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
292d0 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
292e0 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
292f0 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
29300 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
29310 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
29320 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
29330 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
29340 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e  l );..  if( idx>
29350 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
29360 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
29370 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
29380 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29390 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
293a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
293b0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
293c0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
293d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
293e0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
293f0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
29400 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
29410 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
29420 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
29430 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
29440 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
29450 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29460 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
29470 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
29490 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
294a0 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
294b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
294c0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77  ->iPage];.    }w
294d0 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64  hile( pCur->aiId
294e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d  x[pCur->iPage]>=
294f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
29500 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
29510 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
29520 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
29530 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
29540 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
29550 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29560 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
29570 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
29580 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
29590 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
295a0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
295b0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
295c0 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20  Cur);.  }.}.int 
295d0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
295e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
295f0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d   int *pRes){.  M
29600 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
29610 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
29620 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
29630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
29640 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
29650 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70  ( *pRes==0 || *p
29660 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  Res==1 );.  asse
29670 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
29680 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
29690 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
296a0 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  LID );.  pCur->i
296b0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
296c0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
296d0 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
296e0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
296f0 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30  fl);.  *pRes = 0
29700 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
29710 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
29720 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72 65  ID ) return btre
29730 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
29740 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
29750 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29760 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b  iPage];.  if( (+
29770 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
29780 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67  r->iPage])>=pPag
29790 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
297a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
297b0 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
297c0 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74  return btreeNext
297d0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
297e0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
297f0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
29800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29810 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
29820 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
29830 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
29840 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
29850 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
29860 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
29870 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
29880 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
29890 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
298a0 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
298b0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
298c0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
298d0 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
298e0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
298f0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
29900 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
29910 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
29920 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
29930 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
29940 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
29950 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
29960 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
29970 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
29980 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
29990 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
299a0 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
299b0 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
299c0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
299d0 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
299e0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
299f0 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
29a00 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
29a10 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
29a20 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
29a30 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
29a40 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
29a50 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
29a60 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
29a70 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
29a80 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
29a90 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
29aa0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
29ab0 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
29ac0 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
29ad0 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
29ae0 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
29af0 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
29b00 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
29b10 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
29b20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
29b30 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
29b40 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
29b50 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
29b60 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
29b70 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
29b80 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
29b90 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
29ba0 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
29bb0 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
29bc0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
29bd0 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
29be0 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
29bf0 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
29c00 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
29c10 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
29c20 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
29c30 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
29c40 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
29c50 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
29c60 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
29c70 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
29c80 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
29c90 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
29ca0 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
29cb0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
29cc0 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f   int btreePrevio
29cd0 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  us(BtCursor *pCu
29ce0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
29cf0 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
29d00 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
29d10 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
29d20 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
29d30 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
29d40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
29d50 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pRes==0 );.  ass
29d60 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
29d70 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
29d80 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
29d90 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
29da0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
29db0 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
29dc0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
29dd0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
29de0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29df0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
29e00 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
29e10 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
29e20 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
29e30 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
29e40 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
29e50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29e80 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
29e90 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
29ea0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
29eb0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
29ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29ed0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
29ee0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
29ef0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
29f00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29f10 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
29f20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29f30 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
29f40 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
29f50 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
29f60 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
29f70 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
29f80 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
29f90 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
29fa0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29fb0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
29fc0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
29fd0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
29fe0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
29ff0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a000 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2a010 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2a020 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2a030 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2a040 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
2a050 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2a060 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2a070 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2a080 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2a090 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2a0a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2a0b0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2a0c0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2a0d0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2a0e0 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2a0f0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a100 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
2a110 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2a120 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2a130 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2a140 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2a150 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2a160 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2a170 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2a180 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2a190 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
2a1a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2a1b0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2a1c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a1d0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2a1e0 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  & (BTCF_ValidNKe
2a1f0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2a200 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
2a210 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a220 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
2a230 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2a240 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2a250 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2a260 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2a270 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2a280 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2a290 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2a2a0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2a2b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2a2c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2a2d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a2e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2a2f0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2a300 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2a310 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Res){.  assert( 
2a320 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2a330 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a340 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20  rt( pRes!=0 );. 
2a350 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2a360 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b  0 || *pRes==1 );
2a370 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a380 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2a390 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2a3a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2a3b0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43 75  *pRes = 0;.  pCu
2a3c0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
2a3d0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
2a3e0 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46  F_ValidOvfl|BTCF
2a3f0 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70  _ValidNKey);.  p
2a400 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2a410 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
2a420 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2a430 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75 72  VALID.   || pCur
2a440 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a450 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43  age]==0.   || pC
2a460 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a470 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30  >iPage]->leaf==0
2a480 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2a490 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70   btreePrevious(p
2a4a0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2a4b0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2a4c0 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2a4d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
2a4f0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
2a500 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2a510 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
2a520 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
2a530 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
2a540 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
2a550 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2a560 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
2a570 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
2a580 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
2a590 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
2a5a0 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
2a5b0 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
2a5c0 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
2a5d0 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
2a5e0 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
2a5f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2a600 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
2a610 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
2a620 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
2a630 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2a640 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
2a650 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
2a660 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
2a670 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
2a680 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
2a690 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
2a6a0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2a6b0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
2a6c0 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
2a6d0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
2a6e0 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
2a6f0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2a700 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2a710 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2a720 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2a730 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2a740 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2a750 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2a760 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2a770 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2a780 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2a790 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2a7a0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2a7b0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2a7c0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2a7d0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2a7e0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2a7f0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2a800 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2a810 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2a820 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2a830 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2a840 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2a850 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2a860 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2a870 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2a880 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2a890 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2a8a0 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2a8b0 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2a8c0 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2a8d0 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2a8e0 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2a8f0 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2a900 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2a910 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2a920 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2a930 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2a940 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2a950 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2a960 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2a970 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2a980 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2a990 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2a9a0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2a9b0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2a9c0 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2a9d0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2a9e0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2a9f0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2aa00 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2aa10 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2aa20 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2aa30 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2aa40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2aa50 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2aa60 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2aa70 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2aa80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2aa90 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2aaa0 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2aab0 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2aac0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2aad0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2aae0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2aaf0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2ab00 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2ab10 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2ab20 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2ab30 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2ab40 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2ab50 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2ab60 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2ab70 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2ab80 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2ab90 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2aba0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2abb0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2abc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2abd0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2abe0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2abf0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2ac00 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2ac10 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2ac20 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2ac30 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2ac40 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2ac50 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2ac60 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
2ac70 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2ac80 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2ac90 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
2aca0 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
2acb0 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
2acc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2acd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2ace0 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
2acf0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
2ad00 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
2ad10 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
2ad20 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
2ad30 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
2ad40 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
2ad50 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
2ad60 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
2ad70 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
2ad80 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
2ad90 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2ada0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2adb0 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2adc0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2add0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2ade0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2adf0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2ae00 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2ae10 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2ae20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2ae30 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2ae40 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2ae50 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2ae60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ae70 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2ae80 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ae90 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2aea0 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2aeb0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2aec0 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2aed0 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2aee0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2aef0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2af00 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2af10 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2af20 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2af30 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2af40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2af50 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2af60 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2af70 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2af80 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2af90 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2afa0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2afb0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2afc0 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2afd0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2afe0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2aff0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2b000 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2b010 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2b020 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2b030 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2b040 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
2b050 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
2b060 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
2b070 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
2b080 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2b090 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2b0a0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2b0b0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2b0c0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2b0d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2b0e0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
2b0f0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
2b100 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
2b110 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
2b120 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
2b130 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
2b140 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
2b150 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
2b160 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
2b170 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
2b180 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
2b190 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
2b1a0 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2b1b0 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2b1c0 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
2b1d0 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
2b1e0 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
2b1f0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2b200 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
2b210 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
2b220 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
2b230 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
2b240 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
2b250 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
2b260 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2b270 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2b280 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
2b290 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
2b2a0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2b2b0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2b2c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2b2d0 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
2b2e0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2b2f0 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
2b300 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
2b310 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2b320 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2b330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2b340 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2b350 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
2b360 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
2b370 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
2b380 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
2b390 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
2b3a0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2b3b0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
2b3c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
2b3d0 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
2b3e0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
2b3f0 61 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20  aData!=0 );..   
2b400 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
2b410 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2b420 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76  ]); /* # of leav
2b430 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b  es on this trunk
2b440 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
2b450 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
2b460 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
2b470 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
2b480 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
2b490 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
2b4a0 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
2b4b0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
2b4c0 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
2b4d0 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
2b4e0 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
2b4f0 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
2b500 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
2b510 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
2b520 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
2b530 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
2b540 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2b550 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2b560 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2b570 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2b580 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2b590 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2b5a0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
2b5b0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2b5c0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2b5d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2b5e0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2b5f0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
2b600 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2b610 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2b620 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
2b630 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
2b640 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
2b650 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
2b660 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
2b670 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2b680 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
2b690 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
2b6a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
2b6b0 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
2b6c0 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
2b6d0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
2b6e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2b6f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b700 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
2b710 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2b720 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
2b730 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2b740 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
2b750 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20  ( searchList .  
2b760 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 65            && (ne
2b770 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20  arby==iTrunk || 
2b780 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26  (iTrunk<nearby &
2b790 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  & eMode==BTALLOC
2b7a0 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a  _LE)) .      ){.
2b7b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
2b7c0 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
2b7d0 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
2b7e0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
2b7f0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2b800 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
2b810 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
2b820 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
2b830 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2b840 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2b850 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a  Trunk;.        *
2b860 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
2b870 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
2b880 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2b890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2b8a0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2b8b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2b8c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2b8d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2b8e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2b8f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b900 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
2b910 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
2b920 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
2b930 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
2b940 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
2b950 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2b960 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2b970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b980 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b990 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
2b9a0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2b9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b9c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2b9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2b9e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2b9f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2ba00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2ba10 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
2ba20 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2ba30 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
2ba40 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
2ba50 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2ba60 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2ba70 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
2ba80 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
2ba90 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
2baa0 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
2bab0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
2bac0 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
2bad0 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
2bae0 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
2baf0 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
2bb00 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
2bb10 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
2bb20 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
2bb30 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
2bb40 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
2bb50 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
2bb60 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2bb70 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
2bb80 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
2bb90 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
2bba0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bbb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2bbc0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2bbd0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2bbe0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2bbf0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2bc00 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
2bc10 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
2bc20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2bc30 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
2bc40 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
2bc50 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
2bc60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2bc70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2bc80 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2bc90 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2bca0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
2bcb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2bcc0 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
2bcd0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2bce0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bcf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2bd00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2bd10 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2bd20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2bd30 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2bd40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2bd50 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2bd60 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
2bd70 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2bd80 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2bd90 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
2bda0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
2bdb0 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
2bdc0 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2bdd0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
2bde0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
2bdf0 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
2be00 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2be10 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
2be20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2be30 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2be40 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2be50 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2be60 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
2be70 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2be80 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2be90 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
2bea0 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
2beb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2bec0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2bed0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2bee0 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2bef0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2bf00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2bf10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2bf20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2bf30 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2bf40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2bf50 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
2bf60 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
2bf70 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
2bf80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bf90 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
2bfa0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2bfb0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2bfc0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
2bfd0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
2bfe0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
2bff0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2c000 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
2c010 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
2c020 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
2c030 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
2c040 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
2c050 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
2c060 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
2c070 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
2c080 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
2c090 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ta;.        if( 
2c0a0 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
2c0b0 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
2c0c0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2c0d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
2c0e0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2c0f0 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _LE ){.         
2c100 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b     for(i=0; i<k;
2c110 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
2c120 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
2c130 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
2c140 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *4]);.          
2c150 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e      if( iPage<=n
2c160 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
2c170 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2c180 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2c190 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2c1a0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c1b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c1c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c1d0 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
2c1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
2c1f0 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  st = sqlite3AbsI
2c200 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
2c210 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
2c220 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2c230 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
2c240 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2c250 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
2c260 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2c270 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2c280 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
2c290 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2c2a0 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
2c2b0 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
2c2c0 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
2c2d0 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
2c2e0 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
2c2f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2c300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c310 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c320 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
2c330 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
2c340 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
2c350 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
2c360 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
2c370 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2c380 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
2c390 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
2c3a0 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
2c3b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c3c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2c3d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2c3e0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2c3f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c400 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
2c410 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
2c420 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
2c430 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
2c440 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
2c450 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
2c460 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
2c470 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
2c480 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2c490 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
2c4a0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2c4b0 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
2c4c0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
2c4d0 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
2c4e0 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
2c4f0 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
2c500 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
2c510 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
2c520 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c530 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
2c540 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
2c550 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
2c560 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2c570 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2c580 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2c590 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c5a0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
2c5b0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2c5c0 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
2c5d0 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
2c5e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
2c5f0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2c600 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
2c610 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2c620 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
2c630 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
2c640 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
2c650 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
2c660 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
2c670 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47  Bt, *pPgno)? PAG
2c680 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
2c690 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
2c6a0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2c6b0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
2c6c0 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  pPage, noContent
2c6d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c6e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2c6f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2c700 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c710 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
2c720 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2c730 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2c740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c750 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2c760 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2c770 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2c780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c790 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2c7a0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2c7b0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61     }.      relea
2c7c0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
2c7d0 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54  k);.      pPrevT
2c7e0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77  runk = 0;.    }w
2c7f0 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74  hile( searchList
2c800 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2c810 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f   /* There are no
2c820 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2c830 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e  eelist, so appen
2c840 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  d a new page to 
2c850 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
2c860 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a  ase image..    *
2c870 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c  *.    ** Normall
2c880 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c  y, new pages all
2c890 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62  ocated by this b
2c8a0 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75  lock can be requ
2c8b0 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20  ested from the. 
2c8c0 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65     ** pager laye
2c8d0 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63  r with the 'no-c
2c8e0 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74  ontent' flag set
2c8f0 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20  . This prevents 
2c900 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a  the pager.    **
2c910 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
2c920 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63  read the pages c
2c930 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
2c940 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
2c950 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
2c960 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
2c970 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65   already run one
2c980 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65   or more increme
2c990 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20  ntal-vacuum.    
2c9a0 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74  ** steps, then t
2c9b0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61  he page we are a
2c9c0 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65  bout to allocate
2c9d0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e   may contain con
2c9e0 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74  tent.    ** that
2c9f0 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
2ca00 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
2ca10 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73  ollback. In this
2ca20 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a   case, do.    **
2ca30 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d   not set the no-
2ca40 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68  content flag. Th
2ca50 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61  is causes the pa
2ca60 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20  ger to load and 
2ca70 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74  journal.    ** t
2ca80 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
2ca90 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f  content before o
2caa0 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20  verwriting it.. 
2cab0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74     **.    ** Not
2cac0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
2cad0 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c   will not actual
2cae0 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ly attempt to lo
2caf0 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20  ad or journal . 
2cb00 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f     ** content fo
2cb10 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  r any page that 
2cb20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20  really does lie 
2cb30 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2cb40 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
2cb50 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b   ** file on disk
2cb60 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73  . So the effects
2cb70 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68   of disabling th
2cb80 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74  e no-content opt
2cb90 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a  imization.    **
2cba0 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e   here are confin
2cbb0 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65  ed to those page
2cbc0 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65  s that lie betwe
2cbd0 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  en the end of th
2cbe0 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2cbf0 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20  e image and the 
2cc00 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62  end of the datab
2cc10 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
2cc20 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74  .    int bNoCont
2cc30 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f  ent = (0==IfNotO
2cc40 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
2cc50 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f  uncate))? PAGER_
2cc60 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b  GET_NOCONTENT:0;
2cc70 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
2cc80 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
2cc90 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
2cca0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
2ccb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2ccc0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
2ccd0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
2cce0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2ccf0 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e  AGE(pBt) ) pBt->
2cd00 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65  nPage++;..#ifnde
2cd10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2cd20 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2cd30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2cd40 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
2cd50 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67  E(pBt, pBt->nPag
2cd60 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
2cd70 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
2cd80 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
2cd90 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
2cda0 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
2cdb0 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
2cdc0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
2cdd0 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
2cde0 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
2cdf0 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
2ce00 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
2ce10 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2ce20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
2ce30 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
2ce40 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2ce50 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20   MemPage *pPg = 
2ce60 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  0;.      TRACE((
2ce70 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
2ce80 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28  om end of file (
2ce90 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2cea0 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65  )\n", pBt->nPage
2ceb0 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
2cec0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45  ( pBt->nPage!=PE
2ced0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2cee0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63  pBt) );.      rc
2cef0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2cf00 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
2cf10 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
2cf20 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
2cf30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2cf40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2cf50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2cf60 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
2cf70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2cf80 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
2cf90 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2cfa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
2cfb0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
2cfc0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
2cfd0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
2cfe0 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
2cff0 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
2d000 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
2d010 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
2d020 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
2d030 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
2d040 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
2d050 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
2d060 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
2d070 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2d080 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
2d090 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2d0a0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2d0b0 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
2d0c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2d0d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
2d0e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2d0f0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
2d100 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2d110 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d120 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2d130 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2d140 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
2d150 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
2d160 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
2d170 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
2d180 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
2d190 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
2d1a0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
2d1b0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2d1c0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
2d1d0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
2d1e0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
2d1f0 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
2d200 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2d210 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
2d220 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
2d230 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
2d240 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
2d250 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
2d260 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
2d270 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2d280 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d290 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2d2a0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
2d2b0 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
2d2c0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
2d2d0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72  .  }.  assert( r
2d2e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2d2f0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2d300 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65  iteable((*ppPage
2d310 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  )->pDbPage) );. 
2d320 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d330 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2d340 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
2d350 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
2d360 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2d370 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
2d380 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
2d390 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
2d3a0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
2d3b0 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
2d3c0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
2d3d0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
2d3e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2d3f0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2d400 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
2d410 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
2d420 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
2d430 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
2d440 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
2d450 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
2d460 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
2d470 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
2d480 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
2d490 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
2d4a0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
2d4b0 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
2d4c0 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
2d4d0 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
2d4e0 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
2d4f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2d500 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
2d510 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
2d520 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
2d530 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
2d540 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
2d550 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
2d560 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
2d570 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
2d580 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
2d590 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
2d5a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2d5b0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2d5c0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
2d5d0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
2d5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d5f0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
2d600 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2d610 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
2d620 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
2d630 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
2d640 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
2d650 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
2d660 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
2d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d680 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
2d690 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
2d6a0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
2d6b0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d6d0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2d6e0 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
2d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d700 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2d710 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2d720 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
2d730 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2d740 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d750 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2d760 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31   assert( iPage>1
2d770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
2d780 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
2d790 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
2d7a0 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50   );..  if( pMemP
2d7b0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2d7c0 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
2d7d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
2d7e0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2d7f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2d800 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2d810 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
2d820 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
2d830 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
2d840 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
2d850 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
2d860 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2d870 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2d880 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
2d890 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2d8a0 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
2d8b0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2d8c0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
2d8d0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2d8e0 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
2d8f0 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
2d900 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
2d910 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
2d920 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
2d930 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
2d940 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
2d950 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
2d960 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
2d970 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
2d980 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
2d990 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2d9a0 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
2d9b0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2d9c0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
2d9d0 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
2d9e0 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
2d9f0 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
2da00 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2da10 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
2da20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
2da30 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2da40 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
2da50 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
2da60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
2da70 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
2da80 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2da90 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
2daa0 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
2dab0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
2dac0 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
2dad0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
2dae0 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
2daf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
2db00 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2db10 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
2db20 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
2db30 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
2db40 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2db50 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2db60 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
2db70 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
2db80 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
2db90 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
2dba0 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
2dbb0 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
2dbc0 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
2dbd0 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
2dbe0 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
2dbf0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
2dc00 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2dc10 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
2dc20 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
2dc30 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
2dc40 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
2dc50 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
2dc60 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
2dc70 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
2dc80 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
2dc90 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2dca0 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
2dcb0 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
2dcc0 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
2dcd0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
2dce0 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
2dcf0 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
2dd00 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
2dd10 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
2dd20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dd40 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2dd50 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
2dd60 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
2dd70 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2dd80 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2dd90 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
2dda0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2ddb0 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
2ddc0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
2ddd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dde0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2ddf0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2de00 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
2de10 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2de20 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2de30 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2de40 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
2de50 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
2de60 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
2de70 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
2de80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2de90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2dea0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2deb0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
2dec0 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
2ded0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
2dee0 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
2def0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
2df00 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
2df10 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
2df20 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
2df30 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
2df40 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
2df50 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
2df60 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
2df70 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
2df80 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
2df90 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
2dfa0 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
2dfb0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
2dfc0 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
2dfd0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
2dfe0 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
2dff0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
2e000 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
2e010 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
2e020 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2e030 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
2e040 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
2e050 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
2e060 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
2e070 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
2e080 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
2e090 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
2e0a0 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
2e0b0 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
2e0c0 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
2e0d0 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
2e0e0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
2e0f0 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
2e100 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2e110 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
2e120 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
2e130 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
2e140 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
2e150 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
2e160 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
2e170 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
2e180 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2e190 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
2e1a0 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
2e1b0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
2e1c0 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
2e1d0 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
2e1e0 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
2e1f0 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
2e200 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
2e210 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
2e220 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
2e230 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
2e240 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
2e250 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2e260 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2e270 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2e280 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2e290 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2e2a0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2e2b0 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20  ], nLeaf+1);.   
2e2c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2e2d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e  Trunk->aData[8+n
2e2e0 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b  Leaf*4], iPage);
2e2f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
2e300 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  ge && (pBt->btsF
2e310 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
2e320 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
2e330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2e340 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2e350 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2e360 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e370 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74     rc = btreeSet
2e380 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
2e390 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iPage);.      }.
2e3a0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
2e3b0 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66  EE-PAGE: %d leaf
2e3c0 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25   on trunk page %
2e3d0 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f  d\n",pPage->pgno
2e3e0 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b  ,pTrunk->pgno));
2e3f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2e400 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2e410 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e    }..  /* If con
2e420 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68  trol flows to th
2e430 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69  is point, then i
2e440 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62  t was not possib
2e450 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20  le to add the.  
2e460 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  ** the page bein
2e470 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61  g freed as a lea
2e480 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69  f page of the fi
2e490 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2e4a0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a   free-list..  **
2e4b0 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   Possibly becaus
2e4c0 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  e the free-list 
2e4d0 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73  is empty, or pos
2e4e0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
2e4f0 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  e .  ** first tr
2e500 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
2e510 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69  list is full. Ei
2e520 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61  ther way, the pa
2e530 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20  ge being freed. 
2e540 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   ** will become 
2e550 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72  the new first tr
2e560 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
2e570 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a  free-list..  */.
2e580 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26    if( pPage==0 &
2e590 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
2e5a0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2e5b0 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
2e5c0 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67  ge, 0)) ){.    g
2e5d0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2e5e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2e5f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e600 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2e610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e620 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
2e630 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2e640 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
2e650 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
2e660 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
2e670 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
2e680 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
2e690 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2e6a0 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
2e6b0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
2e6c0 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
2e6d0 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
2e6e0 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
2e6f0 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
2e700 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2e710 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
2e720 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2e730 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2e740 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
2e750 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
2e760 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e770 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2e780 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
2e790 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  age, int *pRC){.
2e7a0 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51    if( (*pRC)==SQ
2e7b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
2e7c0 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28  pRC = freePage2(
2e7d0 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67  pPage->pBt, pPag
2e7e0 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b  e, pPage->pgno);
2e7f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
2e800 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
2e810 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
2e820 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
2e830 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65  Cell.  Write the
2e840 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73  .** local Cell s
2e850 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20  ize (the number 
2e860 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20  of bytes on the 
2e870 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f  original page, o
2e880 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  mitting.** overf
2e890 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a  low) into *pnSiz
2e8a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2e8b0 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65   clearCell(.  Me
2e8c0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2e8d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
2e8e0 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
2e8f0 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
2e900 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2e910 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74  ell,    /* First
2e920 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c   byte of the Cel
2e930 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69  l */.  u16 *pnSi
2e940 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2e950 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73 69 7a  /* Write the siz
2e960 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65  e of the Cell he
2e970 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  re */.){.  BtSha
2e980 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2e990 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
2e9a0 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
2e9b0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
2e9c0 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
2e9d0 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
2e9e0 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
2e9f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2ea00 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2ea10 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
2ea20 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2ea30 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2ea40 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  ;.  *pnSize = in
2ea50 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20  fo.nSize;.  if( 
2ea60 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d  info.iOverflow==
2ea70 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2ea80 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e  SQLITE_OK;  /* N
2ea90 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
2eaa0 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74  . Return without
2eab0 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
2eac0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65  */.  }.  if( pCe
2ead0 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
2eae0 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  w+3 > pPage->aDa
2eaf0 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
2eb00 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
2eb10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2eb20 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
2eb30 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
2eb40 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
2eb50 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
2eb60 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
2eb70 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
2eb80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2eb90 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
2eba0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
2ebb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2ebc0 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
2ebd0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
2ebe0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
2ebf0 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
2ec00 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
2ec10 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
2ec20 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
2ec30 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
2ec40 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
2ec50 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
2ec60 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2ec70 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
2ec80 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
2ec90 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
2eca0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
2ecb0 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
2ecc0 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
2ecd0 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
2ece0 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
2ecf0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
2ed00 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
2ed10 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
2ed20 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
2ed30 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
2ed40 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
2ed50 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
2ed60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ed70 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2ed80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
2ed90 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
2eda0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
2edb0 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
2edc0 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
2edd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2ede0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2edf0 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
2ee00 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
2ee10 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
2ee20 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
2ee30 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
2ee40 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2ee50 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
2ee60 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
2ee70 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
2ee80 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
2ee90 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
2eea0 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
2eeb0 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
2eec0 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
2eed0 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
2eee0 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
2eef0 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
2ef00 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
2ef10 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
2ef20 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
2ef30 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
2ef40 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
2ef50 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
2ef60 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
2ef70 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
2ef80 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
2ef90 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2efa0 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
2efb0 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
2efc0 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
2efd0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
2efe0 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
2eff0 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
2f000 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
2f010 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
2f020 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
2f030 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
2f040 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
2f050 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
2f060 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
2f070 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
2f080 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
2f090 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
2f0a0 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
2f0b0 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
2f0c0 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
2f0d0 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
2f0e0 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
2f0f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2f100 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2f110 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2f120 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
2f130 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
2f140 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2f150 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
2f160 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2f170 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
2f180 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2f190 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2f1a0 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
2f1b0 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
2f1c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f1d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2f1e0 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
2f1f0 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
2f200 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
2f210 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
2f220 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
2f230 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
2f240 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
2f250 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
2f260 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
2f270 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
2f280 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
2f290 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
2f2a0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2f2b0 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
2f2c0 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
2f2d0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
2f2e0 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
2f2f0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2f300 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
2f310 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
2f320 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
2f330 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
2f340 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
2f350 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
2f360 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
2f370 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
2f380 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
2f390 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
2f3a0 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
2f3b0 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
2f3c0 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
2f3d0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2f3e0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
2f3f0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2f400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f410 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
2f420 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
2f430 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2f440 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
2f450 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
2f460 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
2f470 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
2f480 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
2f490 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
2f4a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2f4b0 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
2f4c0 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
2f4d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4f0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
2f500 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
2f510 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
2f520 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
2f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f540 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
2f550 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
2f560 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
2f570 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
2f580 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
2f590 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
2f5a0 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
2f5b0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
2f5c0 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
2f5d0 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
2f5e0 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
2f5f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2f600 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
2f610 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2f620 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
2f630 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
2f640 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73  t nHeader;..  as
2f650 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2f660 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2f670 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
2f680 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
2f690 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
2f6a0 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
2f6b0 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
2f6c0 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
2f6d0 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
2f6e0 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
2f6f0 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
2f700 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
2f710 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
2f720 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
2f730 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
2f740 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
2f750 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
2f760 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2f770 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2f780 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
2f790 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
2f7a0 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70  */.  nHeader = p
2f7b0 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
2f7c0 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ze;.  nPayload =
2f7d0 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
2f7e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2f7f0 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 6e  KeyLeaf ){.    n
2f800 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2f810 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
2f820 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
2f830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
2f840 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30 20  ssert( nData==0 
2f850 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2f860 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  Zero==0 );.  }. 
2f870 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
2f880 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
2f890 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e  ader], *(u64*)&n
2f8a0 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  Key);.  .  /* Fi
2f8b0 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
2f8c0 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28 20  d size */.  if( 
2f8d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
2f8e0 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61 74  .    pSrc = pDat
2f8f0 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44  a;.    nSrc = nD
2f900 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d  ata;.    nData =
2f910 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20   0;.  }else{ .  
2f920 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79    if( NEVER(nKey
2f930 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70  >0x7fffffff || p
2f940 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  Key==0) ){.     
2f950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2f960 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f970 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
2f980 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20  = (int)nKey;.   
2f990 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
2f9a0 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b    nSrc = (int)nK
2f9b0 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  ey;.  }.  if( nP
2f9c0 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
2f9d0 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e  axLocal ){.    n
2f9e0 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61   = nHeader + nPa
2f9f0 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63  yload;.    testc
2fa00 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20  ase( n==3 );.   
2fa10 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20   testcase( n==4 
2fa20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29  );.    if( n<4 )
2fa30 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53   n = 4;.    *pnS
2fa40 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61  ize = n;.    spa
2fa50 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61  ceLeft = nPayloa
2fa60 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20  d;.    pPrior = 
2fa70 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCell;.  }else{.
2fa80 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61      int mn = pPa
2fa90 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
2faa0 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79    n = mn + (nPay
2fab0 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50  load - mn) % (pP
2fac0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2fad0 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
2fae0 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67  estcase( n==pPag
2faf0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
2fb00 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
2fb10 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
2fb20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e  1 );.    if( n >
2fb30 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
2fb40 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73   ) n = mn;.    s
2fb50 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20  paceLeft = n;.  
2fb60 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20    *pnSize = n + 
2fb70 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20  nHeader + 4;.   
2fb80 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
2fb90 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d  [nHeader+n];.  }
2fba0 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70  .  pPayload = &p
2fbb0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a  Cell[nHeader];..
2fbc0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
2fbd0 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f  nt variables sho
2fbe0 75 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f  uld be set as fo
2fbf0 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  llows:.  **.  **
2fc00 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20     nPayload     
2fc10 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c        Total payl
2fc20 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  oad size in byte
2fc30 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61  s.  **   pPayloa
2fc40 64 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69  d           Begi
2fc50 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61  n writing payloa
2fc60 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70  d here.  **   sp
2fc70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20  aceLeft         
2fc80 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   Space available
2fc90 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49   at pPayload.  I
2fca0 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65  f nPayload>space
2fcb0 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20  Left,.  **      
2fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcd0 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65  that means conte
2fce0 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e  nt must spill in
2fcf0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
2fd00 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a  s..  **   *pnSiz
2fd10 65 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a  e            Siz
2fd20 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63  e of the local c
2fd30 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ell (not countin
2fd40 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  g overflow pages
2fd50 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20  ).  **   pPrior 
2fd60 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72              Wher
2fd70 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70  e to write the p
2fd80 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74  gno of the first
2fd90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
2fda0 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63   **.  ** Use a c
2fdb0 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73  all to btreePars
2fdc0 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65  eCellPtr() to ve
2fdd0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61  rify that the va
2fde0 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20  lues above.  ** 
2fdf0 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f  were computed co
2fe00 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69  rrectly..  */.#i
2fe10 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2fe20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20   {.    CellInfo 
2fe30 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65 65 50  info;.    btreeP
2fe40 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2fe50 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2fe60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48  ;.    assert( nH
2fe70 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f  eader=(int)(info
2fe80 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c  .pPayload - pCel
2fe90 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  l) );.    assert
2fea0 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65  ( info.nKey==nKe
2feb0 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
2fec0 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
2fed0 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
2fee0 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
2fef0 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
2ff00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2ff10 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c 5b 69  rior == &pCell[i
2ff20 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 20 29  nfo.iOverflow] )
2ff30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2ff40 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
2ff50 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
2ff60 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
2ff70 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
2ff80 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
2ff90 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
2ffa0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
2ffb0 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
2ffc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2ffd0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2ffe0 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
2fff0 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
30000 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
30010 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
30020 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
30030 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
30040 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
30050 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
30060 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
30070 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
30080 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
30090 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
300a0 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
300b0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
300c0 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
300d0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
300e0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
300f0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
30100 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
30110 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
30120 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
30130 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30140 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
30150 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
30160 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
30170 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
30180 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
30190 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
301a0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
301b0 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
301c0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
301d0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
301e0 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
301f0 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
30200 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
30210 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
30220 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
30230 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
30240 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
30250 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
30260 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
30270 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
30280 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
30290 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
302a0 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
302b0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
302c0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
302d0 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
302e0 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
302f0 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
30300 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
30310 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
30320 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
30330 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
30340 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
30350 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
30360 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
30370 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30380 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
30390 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
303a0 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
303b0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
303c0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
303d0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
303e0 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
303f0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
30400 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
30410 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30420 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
30430 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
30440 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
30450 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30460 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
30470 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30480 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
30490 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
304a0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
304b0 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
304c0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
304d0 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
304e0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
304f0 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
30500 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
30510 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
30520 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
30530 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
30540 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30550 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
30560 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
30570 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
30580 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
30590 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
305a0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
305b0 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
305c0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
305d0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
305e0 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
305f0 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
30600 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
30610 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
30620 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
30630 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30640 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
30650 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
30660 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
30670 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
30680 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
30690 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
306a0 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
306b0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
306c0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
306d0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
306e0 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
306f0 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
30700 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
30710 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
30720 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
30730 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
30740 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
30750 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
30760 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
30770 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
30780 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
30790 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
307a0 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
307b0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
307c0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
307d0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
307e0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
307f0 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
30800 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
30810 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
30820 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
30830 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
30840 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
30850 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
30860 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
30870 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
30880 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
30890 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
308a0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
308b0 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
308c0 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
308d0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
308e0 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
308f0 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
30900 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
30910 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
30920 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
30930 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
30940 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
30950 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
30960 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
30970 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
30980 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
30990 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
309a0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
309b0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
309c0 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
309d0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
309e0 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
309f0 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
30a00 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
30a10 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
30a20 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
30a30 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
30a40 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
30a50 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
30a60 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
30a70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
30a80 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
30a90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
30aa0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
30ab0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
30ac0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
30ad0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
30ae0 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
30af0 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
30b00 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
30b10 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
30b20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
30b30 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
30b40 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
30b50 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
30b60 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
30b70 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
30b80 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
30b90 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
30ba0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
30bb0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
30bc0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
30bd0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
30be0 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
30bf0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
30c00 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
30c10 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
30c20 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
30c30 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
30c40 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
30c50 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
30c60 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
30c70 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
30c80 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
30c90 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
30ca0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
30cb0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
30cc0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
30cd0 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
30ce0 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
30cf0 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
30d00 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
30d10 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
30d20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
30d30 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
30d40 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
30d50 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
30d60 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
30d70 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
30d80 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
30d90 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
30da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
30db0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
30dc0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
30dd0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
30de0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
30df0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
30e00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
30e10 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
30e20 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65  ;.  ptr = &pPage
30e30 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78  ->aCellIdx[2*idx
30e40 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  ];.  pc = get2by
30e50 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d  te(ptr);.  hdr =
30e60 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
30e70 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  t;.  testcase( p
30e80 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  c==get2byte(&dat
30e90 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74  a[hdr+5]) );.  t
30ea0 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
30eb0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
30ec0 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  leSize );.  if( 
30ed0 70 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79  pc < (u32)get2by
30ee0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
30ef0 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67   || pc+sz > pPag
30f00 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
30f10 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
30f20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
30f30 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
30f40 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
30f50 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
30f60 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
30f70 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
30f80 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
30f90 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
30fa0 2d 2d 3b 0a 20 20 6d 65 6d 6d 6f 76 65 28 70 74  --;.  memmove(pt
30fb0 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
30fc0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
30fd0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
30fe0 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
30ff0 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61  e->nCell);.  pPa
31000 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
31010 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
31020 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
31030 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
31040 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
31050 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
31060 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
31070 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
31080 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
31090 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
310a0 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
310b0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
310c0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
310d0 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
310e0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
310f0 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
31100 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
31110 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
31120 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
31130 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
31140 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
31150 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b  apOvfl[] and mak
31160 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  e it point to th
31170 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28  e cell content (
31180 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65  either.** in pTe
31190 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e  mp or the origin
311a0 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c  al pCell) and al
311b0 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e  so record its in
311c0 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74  dex. .** Allocat
311d0 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20  ing a new entry 
311e0 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b  in pPage->aCell[
311f0 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a  ] implies that .
31200 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ** pPage->nOverf
31210 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  low is increment
31220 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b  ed..**.** If nSk
31230 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ip is non-zero, 
31240 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79  then do not copy
31250 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70   the first nSkip
31260 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a   bytes of the.**
31270 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65   cell. The calle
31280 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  r will overwrite
31290 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73   them after this
312a0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
312b0 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69  s. If.** nSkip i
312c0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
312d0 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70   pCell may not p
312e0 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c  oint to an inval
312f0 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  id memory locati
31300 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c  on .** (but pCel
31310 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79  l+nSkip is alway
31320 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61  s valid)..*/.sta
31330 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
31340 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
31350 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
31360 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
31370 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
31380 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
31390 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
313a0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
313b0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
313c0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
313d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
313e0 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
313f0 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
31400 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
31410 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
31420 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
31430 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
31440 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
31450 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
31460 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
31470 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
31480 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
31490 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
314a0 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
314b0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
314c0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
314d0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
314e0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
314f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
31500 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
31510 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
31520 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
31530 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
31540 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
31550 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
31560 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
31570 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
31580 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
31590 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
315a0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
315b0 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
315c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
315d0 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
315e0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
315f0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
31600 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
31610 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
31620 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
31630 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
31640 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
31650 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
31660 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
31670 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6b 69  ge */.  int nSki
31680 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20  p = (iChild ? 4 
31690 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52  : 0);..  if( *pR
316a0 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
316b0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
316c0 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
316d0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
316e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
316f0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
31700 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
31710 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
31720 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
31730 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
31740 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
31750 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
31760 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
31770 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
31780 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
31790 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
317a0 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
317b0 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
317c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
317d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
317e0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
317f0 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
31800 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
31810 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
31820 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
31830 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
31840 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
31850 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
31860 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
31870 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
31880 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
31890 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
318a0 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
318b0 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
318c0 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
318d0 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
318e0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
318f0 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
31900 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
31910 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
31920 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
31930 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
31940 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
31950 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
31960 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
31970 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
31980 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
31990 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
319a0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
319b0 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
319c0 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
319d0 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
319e0 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b     memcpy(pTemp+
319f0 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b  nSkip, pCell+nSk
31a00 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
31a10 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
31a20 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
31a30 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
31a40 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
31a50 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
31a60 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
31a70 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
31a80 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
31a90 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
31aa0 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  pOvfl)/sizeof(pP
31ab0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  age->apOvfl[0]))
31ac0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
31ad0 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
31ae0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
31af0 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
31b00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
31b10 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
31b20 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
31b30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
31b40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31b50 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
31b60 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
31b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
31b80 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
31b90 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
31ba0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
31bb0 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
31bc0 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c  >aData;.    cell
31bd0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
31be0 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
31bf0 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
31c00 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
31c10 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  l;.    ins = cel
31c20 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
31c30 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
31c40 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
31c50 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
31c60 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
31c70 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
31c80 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
31c90 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
31ca0 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
31cb0 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65  lowing two prope
31cc0 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20  rties.    ** if 
31cd0 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  it returns succe
31ce0 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ss */.    assert
31cf0 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29  ( idx >= end+2 )
31d00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
31d10 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61  x+sz <= (int)pPa
31d20 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
31d30 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
31d40 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
31d50 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
31d60 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
31d70 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
31d80 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
31d90 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
31da0 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
31db0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
31dc0 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
31dd0 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
31de0 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74 61     memmove(&data
31df0 5b 69 6e 73 2b 32 5d 2c 20 26 64 61 74 61 5b 69  [ins+2], &data[i
31e00 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73 29 3b 0a 20  ns], end-ins);. 
31e10 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
31e20 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
31e30 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
31e40 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
31e50 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
31e60 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
31e70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
31e80 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
31e90 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
31ea0 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
31eb0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
31ec0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
31ed0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
31ee0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
31ef0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
31f00 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
31f10 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
31f20 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
31f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
31f40 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
31f50 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
31f60 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
31f70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
31f80 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
31f90 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
31fa0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
31fb0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
31fc0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
31fd0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
31fe0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
31ff0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32000 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
32010 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
32020 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
32030 20 62 65 20 61 73 73 65 6d 62 6c 65 64 20 2a 2f   be assembled */
32040 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
32050 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
32060 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  er of cells to a
32070 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20  dd to this page 
32080 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
32090 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
320a0 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65  rs to cell bodie
320b0 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a  s */.  u16 *aSiz
320c0 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  e        /* Size
320d0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a  s of the cells *
320e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
320f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
32100 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
32110 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20   *pCellptr;     
32120 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
32130 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  xt cell pointer 
32140 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64  */.  int cellbod
32150 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  y;     /* Addres
32160 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62  s of next cell b
32170 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  ody */.  u8 * co
32180 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
32190 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
321a0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
321b0 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  to data for pPag
321c0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
321d0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
321e0 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
321f0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
32200 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20  header on pPage 
32210 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e  */.  const int n
32220 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e  Usable = pPage->
32230 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
32240 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
32250 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73  of page */..  as
32260 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
32270 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
32280 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
32290 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
322a0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
322b0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e    assert( nCell>
322c0 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e  =0 && nCell<=(in
322d0 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  t)MX_CELL(pPage-
322e0 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20  >pBt).          
322f0 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c    && (int)MX_CEL
32300 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
32310 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28  0921);.  assert(
32320 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
32330 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
32340 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
32350 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
32360 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62   page has just b
32370 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65  een zeroed by ze
32380 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73  roPage() */.  as
32390 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
323a0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
323b0 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  t( get2byteNotZe
323c0 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
323d0 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20  ==nUsable );..  
323e0 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67  pCellptr = &pPag
323f0 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c  e->aCellIdx[nCel
32400 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
32410 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
32420 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
32430 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36  0; i--){.    u16
32440 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a   sz = aSize[i];.
32450 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20      pCellptr -= 
32460 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  2;.    cellbody 
32470 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62  -= sz;.    put2b
32480 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
32490 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
324a0 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
324b0 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
324c0 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62  sz);.  }.  put2b
324d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
324e0 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32  , nCell);.  put2
324f0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
32500 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20  ], cellbody);.  
32510 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
32520 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62  (nCell*2 + nUsab
32530 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a  le - cellbody);.
32540 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
32550 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a   (u16)nCell;.}..
32560 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
32570 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64  ing parameters d
32580 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e  etermine how man
32590 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73  y adjacent pages
325a0 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a   get involved.**
325b0 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20   in a balancing 
325c0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69  operation.  NN i
325d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
325e0 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
325f0 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74  her side.** of t
32600 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72  he page that par
32610 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
32620 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
32630 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a  ion.  NB is the.
32640 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  ** total number 
32650 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61  of pages that pa
32660 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75  rticipate, inclu
32670 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20  ding the target 
32680 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e  page and.** NN n
32690 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
326a0 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  er side..**.** T
326b0 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  he minimum value
326c0 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20   of NN is 1 (of 
326d0 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61  course).  Increa
326e0 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a  sing NN above 1.
326f0 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67  ** (to 2 or 3) g
32700 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d  ives a modest im
32710 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c  provement in SEL
32720 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70  ECT and DELETE p
32730 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e  erformance.** in
32740 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20   exchange for a 
32750 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69  larger degradati
32760 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64  on in INSERT and
32770 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61   UPDATE performa
32780 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  nce..** The valu
32790 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20  e of NN appears 
327a0 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74  to give the best
327b0 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c   results overall
327c0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20  ..*/.#define NN 
327d0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1             /*
327e0 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   Number of neigh
327f0 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
32800 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ide of pPage */.
32810 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32  #define NB (NN*2
32820 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  +1)      /* Tota
32830 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64  l pages involved
32840 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20   in the balance 
32850 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  */...#ifndef SQL
32860 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
32870 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LANCE./*.** This
32880 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61   version of bala
32890 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68  nce() handles th
328a0 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c  e common special
328b0 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61   case where.** a
328c0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65   new entry is be
328d0 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20  ing inserted on 
328e0 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
328f0 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  t-end of the.** 
32900 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77  tree, in other w
32910 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e  ords, when the n
32920 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  ew entry will be
32930 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74  come the largest
32940 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65  .** entry in the
32950 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73   tree..**.** Ins
32960 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74  tead of trying t
32970 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  o balance the 3 
32980 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
32990 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
329a0 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
329b0 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
329c0 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
329d0 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
329e0 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
329f0 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
32a00 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
32a10 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
32a20 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
32a30 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
32a40 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
32a50 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
32a60 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
32a70 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
32a80 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
32a90 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
32aa0 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
32ab0 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
32ac0 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
32ad0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
32ae0 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
32af0 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
32b00 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
32b10 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
32b20 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
32b30 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
32b40 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
32b50 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
32b60 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
32b70 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
32b80 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62  .** The pSpace b
32b90 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f  uffer is used to
32ba0 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61   store a tempora
32bb0 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64  ry copy of the d
32bc0 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74  ivider.** cell t
32bd0 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
32be0 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e  rted into pParen
32bf0 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63  t. Such a cell c
32c00 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a  onsists of a 4.*
32c10 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  * byte page numb
32c20 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  er followed by a
32c30 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
32c40 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68   integer. In oth
32c50 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20  er.** words, at 
32c60 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48  most 13 bytes. H
32c70 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20  ence the pSpace 
32c80 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61  buffer must be a
32c90 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79  t.** least 13 by
32ca0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
32cb0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
32cc0 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
32cd0 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61   *pParent, MemPa
32ce0 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
32cf0 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72  Space){.  BtShar
32d00 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20  ed *const pBt = 
32d10 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f  pPage->pBt;    /
32d20 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73  * B-Tree Databas
32d30 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
32d40 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
32d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
32d60 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
32d70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
32d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32da0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
32db0 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20    Pgno pgnoNew; 
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dd0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
32de0 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f  umber of pNew */
32df0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
32e00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32e10 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
32e20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
32e30 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32e40 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
32e50 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
32e60 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
32e70 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20  erflow==1 );..  
32e80 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f  /* This error co
32e90 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63  ndition is now c
32ea0 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
32eb0 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e  eaching this fun
32ec0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70  ction */.  if( p
32ed0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
32ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
32ef0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
32f00 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
32f10 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67  w page. This pag
32f20 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  e will become th
32f30 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  e right-sibling 
32f40 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20  of .  ** pPage. 
32f50 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20  Make the parent 
32f60 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73  page writable, s
32f70 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64  o that the new d
32f80 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a  ivider cell.  **
32f90 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64   may be inserted
32fa0 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20  . If both these 
32fb0 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73  operations are s
32fc0 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65  uccessful, proce
32fd0 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ed..  */.  rc = 
32fe0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
32ff0 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70  e(pBt, &pNew, &p
33000 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a  gnoNew, 0, 0);..
33010 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
33020 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a  _OK ){..    u8 *
33030 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34  pOut = &pSpace[4
33040 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
33050 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c   = pPage->apOvfl
33060 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43  [0];.    u16 szC
33070 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
33080 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
33090 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a  .    u8 *pStop;.
330a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
330b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
330c0 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  able(pNew->pDbPa
330d0 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge) );.    asser
330e0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  t( pPage->aData[
330f0 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c  0]==(PTF_INTKEY|
33100 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
33110 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65  _LEAF) );.    ze
33120 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46  roPage(pNew, PTF
33130 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
33140 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a  DATA|PTF_LEAF);.
33150 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65      assemblePage
33160 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c  (pNew, 1, &pCell
33170 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20  , &szCell);..   
33180 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
33190 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
331a0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
331b0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
331c0 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
331d0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
331e0 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
331f0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
33200 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
33210 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
33220 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
33230 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
33240 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
33250 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
33260 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
33270 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
33280 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
33290 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
332a0 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
332b0 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
332c0 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
332d0 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
332e0 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
332f0 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
33300 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
33310 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
33320 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
33330 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
33340 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
33350 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
33360 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
33370 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
33380 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
33390 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
333a0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
333b0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
333c0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
333d0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
333e0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
333f0 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
33400 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
33410 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
33420 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
33430 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33440 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
33450 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
33460 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
33470 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
33480 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
33490 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
334a0 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
334b0 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
334c0 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
334d0 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
334e0 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
334f0 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
33500 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
33510 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
33520 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
33530 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
33540 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
33550 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
33560 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
33570 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
33580 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
33590 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
335a0 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
335b0 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
335c0 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
335d0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
335e0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
335f0 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
33600 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
33610 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
33620 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
33630 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
33640 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
33650 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
33660 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
33670 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
33680 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
33690 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
336a0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
336b0 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
336c0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
336d0 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
336e0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
336f0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
33700 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
33710 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
33720 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
33730 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
33740 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
33750 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
33760 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
33770 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
33780 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
33790 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
337a0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
337b0 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
337c0 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
337d0 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
337e0 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
337f0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
33800 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
33810 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
33820 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
33830 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
33840 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
33850 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
33860 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
33870 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
33880 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
33890 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
338a0 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
338b0 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
338c0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
338d0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
338e0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
338f0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
33900 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
33910 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
33920 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
33930 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
33940 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
33950 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
33960 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
33970 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
33980 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
33990 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
339a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
339b0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
339c0 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
339d0 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
339e0 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
339f0 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
33a00 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
33a10 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
33a20 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
33a30 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
33a40 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
33a50 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
33a60 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
33a70 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
33a80 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
33a90 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
33aa0 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
33ab0 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
33ac0 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
33ad0 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
33ae0 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
33af0 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
33b00 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
33b10 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
33b20 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
33b30 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
33b40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
33b50 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
33b60 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
33b70 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
33b80 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
33b90 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
33ba0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
33bb0 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
33bc0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
33bd0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
33be0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
33bf0 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
33c00 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
33c10 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
33c20 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
33c30 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
33c40 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
33c50 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
33c60 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
33c70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
33c80 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
33c90 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
33ca0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
33cb0 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
33cc0 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
33cd0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
33ce0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
33cf0 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
33d00 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
33d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33d20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
33d30 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
33d40 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
33d50 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
33d60 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
33d70 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
33d80 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
33d90 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
33da0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
33db0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
33dc0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
33dd0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
33de0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
33df0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
33e00 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
33e10 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
33e20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
33e30 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
33e40 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
33e50 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
33e60 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
33e70 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
33e80 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
33e90 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
33ea0 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
33eb0 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
33ec0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
33ed0 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
33ee0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
33ef0 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
33f00 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
33f10 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
33f20 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
33f30 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
33f40 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
33f50 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
33f60 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
33f70 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
33f80 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
33f90 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
33fa0 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
33fb0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
33fc0 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
33fd0 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
33fe0 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
33ff0 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79  e.apOvfl[] array
34000 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
34010 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
34020 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
34030 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
34040 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
34050 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
34060 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
34070 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
34080 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
34090 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
340a0 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
340b0 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
340c0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
340d0 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
340e0 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
340f0 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
34100 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
34110 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
34120 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
34130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
34140 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
34150 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
34160 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
34170 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
34180 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
34190 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
341a0 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
341b0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
341c0 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
341d0 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
341e0 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
341f0 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
34200 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
34210 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
34220 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
34230 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
34240 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
34250 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
34260 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
34270 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
34280 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
34290 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
342a0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
342b0 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
342c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
342d0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
342e0 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
342f0 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
34300 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
34310 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
34320 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
34330 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
34340 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
34350 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
34360 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
34370 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
34380 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
34390 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
343a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
343b0 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
343c0 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
343d0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
343e0 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
343f0 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
34400 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
34410 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
34420 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
34430 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
34440 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
34450 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
34460 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
34470 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
34480 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
34490 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
344a0 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
344b0 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
344c0 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
344d0 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
344e0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
344f0 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
34500 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
34510 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
34520 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
34530 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
34540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34550 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
34560 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
34570 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
34580 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
34590 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
345a0 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
345b0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
345c0 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
345d0 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
345e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
345f0 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
34600 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
34610 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
34620 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
34630 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
34640 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
34650 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
34660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
34670 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
34680 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
34690 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
346a0 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
346b0 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
346c0 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
346d0 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
346e0 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
346f0 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
34700 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
34710 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
34720 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
34730 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
34740 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
34750 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
34760 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
34770 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
34780 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
34790 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
347a0 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
347b0 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
347c0 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
347d0 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
347e0 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
347f0 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
34800 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
34810 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
34820 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
34830 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
34840 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
34850 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
34860 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
34870 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
34880 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
34890 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
348a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
348b0 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
348c0 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
348d0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
348e0 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
348f0 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
34900 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
34910 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
34920 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
34930 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
34940 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
34950 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
34960 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
34970 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
34980 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
34990 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
349a0 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
349b0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
349c0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
349d0 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
349e0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
349f0 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
34a00 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
34a10 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
34a20 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
34a30 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
34a40 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
34a50 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
34a60 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
34a70 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
34a80 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
34a90 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
34aa0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
34ab0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
34ac0 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
34ad0 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
34ae0 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
34af0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
34b00 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
34b10 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
34b20 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
34b30 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
34b40 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
34b50 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
34b60 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
34b70 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
34b80 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
34b90 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
34ba0 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
34bb0 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
34bc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
34bd0 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
34be0 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
34bf0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
34c00 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
34c10 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
34c20 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
34c30 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
34c40 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
34c50 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
34c60 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
34c70 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
34c80 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
34c90 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
34ca0 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20  a.** buffer big 
34cb0 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f  enough to hold o
34cc0 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c  ne page. If whil
34cd0 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  e inserting cell
34ce0 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
34cf0 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
34d00 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  nt) the parent p
34d10 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
34d20 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
34d30 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
34d40 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
34d50 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  's overflow cell
34d60 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
34d70 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
34d80 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
34d90 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
34da0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
34db0 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
34dc0 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
34dd0 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
34de0 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
34df0 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
34e00 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
34e10 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
34e20 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
34e30 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
34e40 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
34e50 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
34e60 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
34e70 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
34e80 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
34e90 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
34ea0 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
34eb0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
34ec0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
34ed0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
34ee0 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
34ef0 53 43 5f 56 45 52 20 3e 3d 20 31 37 30 30 20 26  SC_VER >= 1700 &
34f00 26 20 64 65 66 69 6e 65 64 28 5f 4d 5f 41 52 4d  & defined(_M_ARM
34f10 29 0a 23 70 72 61 67 6d 61 20 6f 70 74 69 6d 69  ).#pragma optimi
34f20 7a 65 28 22 22 2c 20 6f 66 66 29 0a 23 65 6e 64  ze("", off).#end
34f30 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  if.static int ba
34f40 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
34f50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
34f60 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
34f70 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
34f80 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
34f90 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
34fa0 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
34fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fc0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
34fd0 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
34fe0 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
34ff0 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
35000 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
35010 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
35020 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
35030 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
35040 6f 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ot,             
35050 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
35060 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
35070 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 69  root-page */.  i
35080 6e 74 20 62 42 75 6c 6b 20 20 20 20 20 20 20 20  nt bBulk        
35090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
350a0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 63  * True if this c
350b0 61 6c 6c 20 69 73 20 70 61 72 74 20 6f 66 20 61  all is part of a
350c0 20 62 75 6c 6b 20 6c 6f 61 64 20 2a 2f 0a 29 7b   bulk load */.){
350d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
350e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
350f0 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
35100 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
35110 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
35120 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35130 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
35140 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
35150 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
35160 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
35170 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
35180 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
35190 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
351a0 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
351b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
351c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
351d0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
351e0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
351f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
35200 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
35210 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
35220 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
35230 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
35240 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
35250 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
35260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
35270 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
35280 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
35290 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
352a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
352b0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
352c0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
352d0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
352e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
352f0 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
35300 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
35310 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
35320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35330 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
35340 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
35350 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
35360 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
35370 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
35380 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
35390 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
353a0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
353b0 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
353c0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
353d0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
353e0 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
353f0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
35400 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
35410 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
35420 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
35430 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
35440 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
35450 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
35460 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
35470 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
35480 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
35490 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
354a0 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
354b0 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
354c0 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
354d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
354e0 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
354f0 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
35500 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
35510 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
35520 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
35530 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
35540 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
35550 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
35560 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
35570 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
35580 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
35590 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
355a0 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
355b0 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
355c0 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
355d0 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
355e0 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
355f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
35600 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
35610 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
35620 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
35630 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
35640 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
35650 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
35660 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
35670 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
35680 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
35690 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
356a0 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
356b0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
356c0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
356d0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
356e0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
356f0 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
35700 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
35710 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
35720 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
35730 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
35740 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
35750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35760 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
35770 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
35780 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
35790 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
357a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
357b0 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
357c0 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
357d0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
357e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357f0 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
35800 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
35810 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
35820 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
35830 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
35840 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
35850 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
35860 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
35870 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
35880 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
35890 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
358a0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
358b0 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
358c0 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
358d0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
358e0 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
358f0 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
35900 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
35910 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
35920 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
35930 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
35940 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
35950 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
35960 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
35970 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
35980 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
35990 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
359a0 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
359b0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
359c0 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
359d0 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
359e0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
359f0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
35a00 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
35a10 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
35a20 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  nt->nOverflow==1
35a30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
35a40 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
35a50 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
35a60 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61 72 65  aiOvfl[0]==iPare
35a70 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20  ntIdx );..  if( 
35a80 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20  !aOvflSpace ){. 
35a90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
35aa0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
35ab0 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69  * Find the sibli
35ac0 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61  ng pages to bala
35ad0 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65  nce. Also locate
35ae0 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
35af0 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74  arent .  ** that
35b00 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c   divide the sibl
35b10 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74  ings. An attempt
35b20 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
35b30 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
35b40 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64  .  ** either sid
35b50 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65  e of pPage. More
35b60 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
35b70 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
35b80 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a  e, however, .  *
35b90 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66  * if there are f
35ba0 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
35bb0 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
35bc0 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72  er side. If pPar
35bd0 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
35be0 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
35bf0 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
35c00 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
35c10 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a  re taken.  .  **
35c20 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
35c30 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64  also drops the d
35c40 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f  ivider cells fro
35c50 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
35c60 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79  e. This.  ** way
35c70 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  , the remainder 
35c80 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
35c90 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
35ca0 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20   deal with any. 
35cb0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c   ** overflow cel
35cc0 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ls in the parent
35cd0 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69 66 20   page, since if 
35ce0 61 6e 79 20 65 78 69 73 74 65 64 20 74 68 65 79  any existed they
35cf0 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20   will.  ** have 
35d00 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72 65 6d  already been rem
35d10 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d  oved..  */.  i =
35d20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
35d30 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d 3e 6e  low + pParent->n
35d40 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c 32 20  Cell;.  if( i<2 
35d50 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
35d60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
35d70 73 73 65 72 74 28 20 62 42 75 6c 6b 3d 3d 30 20  ssert( bBulk==0 
35d80 7c 7c 20 62 42 75 6c 6b 3d 3d 31 20 29 3b 0a 20  || bBulk==1 );. 
35d90 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64     if( iParentId
35da0 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  x==0 ){         
35db0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e          .      n
35dc0 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xDiv = 0;.    }e
35dd0 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49  lse if( iParentI
35de0 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e  dx==i ){.      n
35df0 78 44 69 76 20 3d 20 69 2d 32 2b 62 42 75 6c 6b  xDiv = i-2+bBulk
35e00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35e10 20 20 20 61 73 73 65 72 74 28 20 62 42 75 6c 6b     assert( bBulk
35e20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 78 44  ==0 );.      nxD
35e30 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d  iv = iParentIdx-
35e40 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  1;.    }.    i =
35e50 20 32 2d 62 42 75 6c 6b 3b 0a 20 20 7d 0a 20 20   2-bBulk;.  }.  
35e60 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 69 66  nOld = i+1;.  if
35e70 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  ( (i+nxDiv-pPare
35e80 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d  nt->nOverflow)==
35e90 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
35ea0 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 26  {.    pRight = &
35eb0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
35ec0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
35ed0 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  t+8];.  }else{. 
35ee0 20 20 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64     pRight = find
35ef0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
35f00 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
35f10 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20  Overflow);.  }. 
35f20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
35f30 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c  (pRight);.  whil
35f40 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  e( 1 ){.    rc =
35f50 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
35f60 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c  pBt, pgno, &apOl
35f70 64 5b 69 5d 2c 20 30 29 3b 0a 20 20 20 20 69 66  d[i], 0);.    if
35f80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65  ( rc ){.      me
35f90 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28  mset(apOld, 0, (
35fa0 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50  i+1)*sizeof(MemP
35fb0 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f  age*));.      go
35fc0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
35fd0 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  up;.    }.    nM
35fe0 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
35ff0 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
36000 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
36010 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d  ;.    if( (i--)=
36020 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =0 ) break;..   
36030 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50   if( i+nxDiv==pP
36040 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d  arent->aiOvfl[0]
36050 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   && pParent->nOv
36060 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
36070 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61 72 65  apDiv[i] = pPare
36080 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20  nt->apOvfl[0];. 
36090 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
360a0 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
360b0 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
360c0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
360d0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
360e0 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
360f0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
36100 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36110 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
36120 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
36130 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
36140 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
36150 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
36160 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
36170 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
36180 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
36190 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
361a0 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
361b0 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
361c0 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
361d0 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
361e0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
361f0 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
36200 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
36210 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
36220 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
36230 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
36240 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
36250 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
36260 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
36270 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
36280 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
36290 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
362a0 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
362b0 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
362c0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
362d0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
362e0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
362f0 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
36300 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
36310 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
36320 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77   ** But not if w
36330 65 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d  e are in secure-
36340 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20  delete mode. In 
36350 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
36360 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  de,.      ** the
36370 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74   dropCell() rout
36380 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69  ine will overwri
36390 74 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65  te the entire ce
363a0 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a  ll with zeroes..
363b0 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73        ** In this
363c0 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69   case, temporari
363d0 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c  ly copy the cell
363e0 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53   into the aOvflS
363f0 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20  pace[].      ** 
36400 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20  buffer. It will 
36410 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67  be copied out ag
36420 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74  ain as soon as t
36430 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66  he aSpace[] buff
36440 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61  er.      ** is a
36450 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20  llocated.  */.  
36460 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73      if( pBt->bts
36470 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
36480 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
36490 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a       int iOff;..
364a0 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53          iOff = S
364b0 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
364c0 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c  (apDiv[i]) - SQL
364d0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
364e0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
364f0 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
36500 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74  f+szNew[i])>(int
36510 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
36520 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
36530 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
36540 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
36550 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
36560 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
36570 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
36580 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
36590 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
365a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
365b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
365c0 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
365d0 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
365e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
365f0 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
36600 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
36610 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
36620 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
36630 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
36640 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
36650 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
36660 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
36670 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
36680 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
36690 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
366a0 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
366b0 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
366c0 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
366d0 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
366e0 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
366f0 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
36700 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
36710 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
36720 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
36730 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
36740 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
36750 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
36760 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
36770 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
36780 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
36790 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
367a0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
367b0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
367c0 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
367d0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
367e0 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
367f0 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
36800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36810 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
36820 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
36830 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
36840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
36860 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
36870 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
36880 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
36890 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
368a0 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
368b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
368c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
368d0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
368e0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
368f0 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
36900 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
36910 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
36920 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
36930 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
36940 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
36950 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
36960 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
36970 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
36980 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
36990 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
369a0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
369b0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
369c0 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
369d0 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
369e0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
369f0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
36a00 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
36a10 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
36a20 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76 69 64  remove the divid
36a30 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er cells.  ** fr
36a40 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
36a50 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
36a60 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
36a70 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
36a80 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
36a90 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
36aa0 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
36ab0 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
36ac0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
36ad0 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
36ae0 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
36af0 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
36b00 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
36b10 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
36b20 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
36b30 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
36b40 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
36b50 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
36b60 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
36b70 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
36b80 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
36b90 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
36ba0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
36bb0 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
36bc0 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
36bd0 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
36be0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
36bf0 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
36c00 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
36c10 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
36c20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
36c30 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
36c40 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
36c50 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c  y keys..  */.  l
36c60 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
36c70 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34  apOld[0]->leaf*4
36c80 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20 61  ;.  leafData = a
36c90 70 4f 6c 64 5b 30 5d 2d 3e 69 6e 74 4b 65 79 4c  pOld[0]->intKeyL
36ca0 65 61 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  eaf;.  for(i=0; 
36cb0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
36cc0 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20    int limit;.   
36cd0 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20   .    /* Before 
36ce0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
36cf0 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79  lse, take a copy
36d00 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69   of the i'th ori
36d10 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20  ginal sibling.  
36d20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
36d30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
36d40 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
36d50 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
36d60 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  her.    ** that 
36d70 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
36d80 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
36d90 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
36da0 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a   be in the.    *
36db0 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
36dc0 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
36dd0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
36de0 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
36df0 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  ] = (MemPage*)&a
36e00 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
36e10 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20  Size + k*i];.   
36e20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70   memcpy(pOld, ap
36e30 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
36e40 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f  emPage));.    pO
36e50 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69  ld->aData = (voi
36e60 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20  d*)&pOld[1];.   
36e70 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44   memcpy(pOld->aD
36e80 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
36e90 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
36ea0 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74  ize);..    limit
36eb0 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
36ec0 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
36ed0 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
36ee0 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
36ef0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
36f00 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
36f10 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
36f20 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
36f30 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
36f40 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
36f50 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
36f60 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
36f70 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
36f80 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
36f90 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
36fa0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
36fb0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
36fc0 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d       u8 *aData =
36fd0 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20   pOld->aData;.  
36fe0 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65      u16 maskPage
36ff0 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67   = pOld->maskPag
37000 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c  e;.      u16 cel
37010 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e  lOffset = pOld->
37020 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
37030 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
37040 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
37050 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
37060 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
37070 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
37080 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28  l] = findCellv2(
37090 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c  aData, maskPage,
370a0 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b   cellOffset, j);
370b0 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
370c0 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
370d0 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
370e0 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
370f0 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
37100 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20    }.    }       
37110 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
37120 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
37130 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
37140 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
37150 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
37160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
37170 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
37180 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
37190 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
371a0 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
371b0 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
371c0 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
371d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
371e0 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
371f0 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
37200 65 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20  ert( iSpace1 <= 
37210 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
37220 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ze );.      memc
37230 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
37240 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61  i], sz);.      a
37250 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
37260 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
37270 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ion;.      asser
37280 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
37290 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
372a0 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
372b0 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
372c0 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d   = szCell[nCell]
372d0 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   - leafCorrectio
372e0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f  n;.      if( !pO
372f0 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
37300 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
37310 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
37320 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
37330 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74   pOld->hdrOffset
37340 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  ==0 );.        /
37350 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
37360 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
37370 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
37380 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
37390 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
373a0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
373b0 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  ll */.        me
373c0 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
373d0 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
373e0 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  [8], 4);.      }
373f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
37400 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
37410 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
37420 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
37430 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
37440 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
37450 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
37460 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
37470 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
37480 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
37490 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
374a0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
374b0 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l++;.    }.  }..
374c0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
374d0 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
374e0 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
374f0 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
37500 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
37510 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
37520 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
37530 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
37540 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
37550 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
37560 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
37570 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
37580 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
37590 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
375a0 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
375b0 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
375c0 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
375d0 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
375e0 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
375f0 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
37600 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
37610 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
37620 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
37630 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
37640 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
37650 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
37660 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
37670 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
37680 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
37690 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
376a0 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
376b0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
376c0 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
376d0 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
376e0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
376f0 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
37700 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
37710 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
37720 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
37730 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
37740 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
37750 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
37760 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
37770 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
37780 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
37790 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
377a0 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
377b0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
377c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
377d0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
377e0 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
377f0 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
37800 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
37810 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
37820 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
37830 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
37840 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
37850 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
37860 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
37870 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
37880 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
37890 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   k++;.      if( 
378a0 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53  k>NB+1 ){ rc = S
378b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
378c0 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  PT; goto balance
378d0 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20  _cleanup; }.    
378e0 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
378f0 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
37900 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
37910 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
37920 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
37930 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
37940 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
37950 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
37960 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
37970 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
37980 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
37990 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
379a0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
379b0 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
379c0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
379d0 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
379e0 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
379f0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
37a00 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
37a10 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
37a20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
37a30 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
37a40 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
37a50 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
37a60 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
37a70 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
37a80 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
37a90 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
37aa0 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
37ab0 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
37ac0 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
37ad0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
37ae0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
37af0 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
37b00 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
37b10 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
37b20 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
37b30 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
37b40 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
37b50 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
37b60 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
37b70 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
37b80 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
37b90 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
37ba0 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
37bb0 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
37bc0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
37bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37be0 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
37bf0 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
37c00 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
37c10 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
37c20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
37c30 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
37c40 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
37c50 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
37c60 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
37c70 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
37c80 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
37c90 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
37ca0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
37cb0 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
37cc0 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
37cd0 73 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20  szRight==0 .    
37ce0 20 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26     || (!bBulk &&
37cf0 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
37d00 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
37d10 43 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20  Cell[r]+2)) .   
37d20 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68   ){.      szRigh
37d30 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b  t += szCell[d] +
37d40 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74   2;.      szLeft
37d50 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20   -= szCell[r] + 
37d60 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  2;.      cntNew[
37d70 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20  i-1]--;.      r 
37d80 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
37d90 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b  1;.      d = r +
37da0 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
37db0 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69     }.    szNew[i
37dc0 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20  ] = szRight;.   
37dd0 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a   szNew[i-1] = sz
37de0 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Left;.  }..  /* 
37df0 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20  Either we found 
37e00 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c  one or more cell
37e10 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29  s (cntnew[0])>0)
37e20 20 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a   or pPage is.  *
37e30 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
37e40 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
37e50 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
37e60 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
37e70 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
37e80 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
37e90 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
37ea0 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
37eb0 2a 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20  **.  ** UPDATE: 
37ec0 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
37ed0 6c 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  low is not neces
37ee0 73 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74  sarily true if t
37ef0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
37f00 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
37f10 2e 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f  .  The corruptio
37f20 6e 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74  n will be detect
37f30 65 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20  ed and reported 
37f40 6c 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68  later.  ** in th
37f50 69 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20  is procedure so 
37f60 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
37f70 20 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20   to act upon it 
37f80 6e 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a  now..  */.#if 0.
37f90 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
37fa0 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
37fb0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
37fc0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
37fd0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52   );.#endif..  TR
37fe0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
37ff0 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c  ld: %d %d %d  ",
38000 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70  .    apOld[0]->p
38010 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d  gno, .    nOld>=
38020 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67  2 ? apOld[1]->pg
38030 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  no : 0,.    nOld
38040 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e  >=3 ? apOld[2]->
38050 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a  pgno : 0.  ));..
38060 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61    /*.  ** Alloca
38070 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20  te k new pages. 
38080 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73   Reuse old pages
38090 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e   where possible.
380a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c  .  */.  if( apOl
380b0 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b  d[0]->pgno<=1 ){
380c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
380d0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
380e0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
380f0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70  cleanup;.  }.  p
38100 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64  ageFlags = apOld
38110 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  [0]->aData[0];. 
38120 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
38130 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
38140 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
38150 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
38160 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
38170 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
38180 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
38190 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
381a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
381b0 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  w->pDbPage);.   
381c0 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20     nNew++;.     
381d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
381e0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
381f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
38200 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
38210 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
38220 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
38230 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20  , &pNew, &pgno, 
38240 28 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e  (bBulk ? 1 : pgn
38250 6f 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  o), 0);.      if
38260 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
38270 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
38280 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e     apNew[i] = pN
38290 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b  ew;.      nNew++
382a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20  ;..      /* Set 
382b0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
382c0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65  entry for the ne
382d0 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20  w sibling page. 
382e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41  */.      if( ISA
382f0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
38300 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
38310 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20  Bt, pNew->pgno, 
38320 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
38330 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
38340 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
38350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
38360 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
38370 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
38380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
38390 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
383a0 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70  * Free any old p
383b0 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
383c0 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77  ot reused as new
383d0 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77   pages..  */.  w
383e0 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a  hile( i<nOld ){.
383f0 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f      freePage(apO
38400 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20  ld[i], &rc);.   
38410 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
38420 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
38430 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
38440 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61  apOld[i]);.    a
38450 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
38460 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a   i++;.  }