/ Hex Artifact Content
Login

Artifact fbaf57644615a46ffd1117096d1ef9197e34de1f:


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 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
0910: 50 50 4c 45 5f 5f 29 20 26 26 20 21 64 65 66 69  PPLE__) && !defi
0920: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
0930: 20 26 26 20 21 64 65 66 69 6e 65 64 28 54 48 33   && !defined(TH3
0940: 5f 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 29 0a  _COMPATIBILITY).
0950: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 67 6c 6f 62    /* Enable glob
0960: 61 6c 20 73 68 61 72 65 64 20 63 61 63 68 65 20  al shared cache 
0970: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 62  function for deb
0980: 75 67 67 69 6e 67 20 61 6e 64 20 75 6e 69 74 20  ugging and unit 
0990: 74 65 73 74 73 2c 20 0a 20 20 2a 2a 20 62 75 74  tests, .  ** but
09a0: 20 6e 6f 74 20 66 6f 72 20 72 65 6c 65 61 73 65   not for release
09b0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   */.  return SQL
09c0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 23 65 6c 73  ITE_MISUSE;.#els
09d0: 65 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e.  sqlite3Globa
09e0: 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
09f0: 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61  cheEnabled = ena
0a00: 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ble;.  return SQ
0a10: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
0a20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0a40: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0a50: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0a60: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0a70: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0a80: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0a90: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0aa0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0ab0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0ac0: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0ad0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0ae0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0af0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0b00: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0b10: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0b20: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0b30: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0b40: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0b50: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0b60: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0b70: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0b80: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0b90: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0ba0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0bb0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0bc0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0bd0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0be0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0bf0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0c00: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0c10: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0c20: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0c30: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0c40: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0c50: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0c60: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c70: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0c80: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0c90: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ca0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0cb0: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0cc0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0cd0: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0ce0: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0cf0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d00: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0d10: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0d20: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0d30: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0d40: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0d50: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0d60: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0d70: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0d80: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0d90: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0da0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0db0: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0dc0: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0dd0: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0de0: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0df0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0e00: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0e10: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0e20: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0e30: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0e40: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0e50: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0e60: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0e70: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0e80: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0e90: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ea0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
0eb0: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
0ec0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ed0: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
0ee0: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
0ef0: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
0f00: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
0f10: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
0f20: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
0f30: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
0f40: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
0f50: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
0f60: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
0f70: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
0f80: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
0f90: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
0fa0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
0fb0: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
0fc0: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
0fd0: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
0fe0: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
0ff0: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1000: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1010: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1020: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1030: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1040: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
1050: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
1060: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
1070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1080: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
1090: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
10a0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
10b0: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
10c0: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
10d0: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
10e0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
10f0: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1100: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1110: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1120: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1130: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1140: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1150: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1160: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
1170: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
1180: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
1190: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
11a0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
11b0: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
11c0: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
11d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11e0: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
11f0: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1200: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1210: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1220: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1230: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1240: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
1250: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
1260: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
1270: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
1280: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
1290: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
12a0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
12b0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
12c0: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
12d0: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
12e0: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
12f0: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1300: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1310: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1320: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1330: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1340: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
1350: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
1360: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
1370: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
1380: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
1390: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
13a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
13b0: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
13c0: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
13d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
13e0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
13f0: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1400: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1410: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1420: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1430: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1440: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
1450: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
1460: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
1470: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
1480: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
1490: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
14a0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
14b0: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
14c0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
14d0: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
14e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
14f0: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1500: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1510: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1520: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1530: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1540: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1550: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
1560: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
1570: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
1580: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
1590: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
15a0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
15b0: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
15c0: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
15d0: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
15e0: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
15f0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1600: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1610: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1620: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1630: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1640: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
1650: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
1660: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
1670: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
1680: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
1690: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
16a0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
16b0: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
16c0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
16d0: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
16e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
16f0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1700: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1710: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1720: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1730: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1740: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
1750: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
1760: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
1770: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
1780: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
1790: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
17a0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
17b0: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
17c0: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
17d0: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
17e0: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
17f0: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1800: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1810: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1820: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1830: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1840: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
1850: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
1860: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
1870: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
1880: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
1890: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
18a0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
18b0: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
18c0: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
18d0: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
18e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
18f0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1900: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1910: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1920: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1930: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1940: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1950: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1960: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1970: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1980: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1990: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
19a0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
19b0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
19c0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
19d0: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
19e0: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
19f0: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1a00: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1a10: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1a20: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1a30: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1a40: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1a50: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1a60: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1a70: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1a80: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1a90: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1aa0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1ab0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1ac0: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1ad0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1ae0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1af0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1b00: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1b10: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1b20: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1b30: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1b40: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1b50: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1b60: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1b70: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1b80: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1b90: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1ba0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1bb0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1bc0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1bd0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1be0: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1bf0: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1c00: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1c10: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1c20: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1c30: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1c50: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1c60: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1c70: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1c80: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1c90: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1ca0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1cb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1cc0: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1cd0: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1ce0: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1cf0: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1d00: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1d10: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1d20: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1d30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1d40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1d50: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1d60: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1d70: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1d80: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1d90: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1da0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1db0: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1dc0: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1dd0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1de0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1df0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1e00: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1e10: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1e20: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1e30: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1e40: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1e50: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1e60: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1e70: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1e80: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ea0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
1eb0: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
1ec0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1ed0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
1ee0: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
1ef0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1f00: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1f10: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
1f20: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
1f30: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
1f40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
1f50: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
1f60: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
1f70: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1f80: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
1f90: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
1fa0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
1fb0: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
1fc0: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
1fd0: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
1fe0: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1ff0: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2000: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2010: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2020: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2030: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2040: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
2050: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
2060: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
2070: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
2080: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2090: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
20a0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
20b0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20c0: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
20d0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
20e0: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
20f0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2100: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2110: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2120: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2130: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2140: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
2150: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
2160: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
2170: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2180: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
2190: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
21a0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
21b0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
21c0: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
21d0: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
21e0: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
21f0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2200: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2210: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2220: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2230: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2240: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2250: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
2260: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
2270: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
2280: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
2290: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
22a0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
22b0: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
22c0: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
22d0: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
22e0: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
22f0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2300: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2310: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2320: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2330: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2340: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
2350: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
2360: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2370: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
2380: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
2390: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
23a0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
23b0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
23c0: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
23d0: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
23e0: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
23f0: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2400: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2410: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2420: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2430: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2440: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
2450: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
2460: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2470: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
2480: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
2490: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
24a0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
24b0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
24c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
24d0: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
24e0: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
24f0: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2500: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2510: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2520: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2530: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2540: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
2550: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
2560: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
2570: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
2580: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
2590: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
25a0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
25b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
25c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
25d0: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
25e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2600: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2610: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2620: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2630: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2640: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
2650: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
2660: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
2670: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
2680: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
2690: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
26a0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
26b0: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
26c0: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
26d0: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
26e0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
26f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2700: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2710: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2720: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2730: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2740: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
2750: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
2760: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
2770: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
2780: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
2790: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
27a0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
27b0: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
27c0: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
27d0: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
27e0: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
27f0: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2800: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2810: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2820: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2830: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2840: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
2850: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2860: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2870: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
2880: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2890: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
28a0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
28b0: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
28c0: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
28d0: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
28e0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
28f0: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2900: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2910: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2920: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2930: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2940: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2950: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2960: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2970: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2980: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2990: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
29a0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
29b0: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
29c0: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
29d0: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
29e0: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
29f0: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2a00: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2a10: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2a20: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2a30: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2a40: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2a50: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2a60: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2a80: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2a90: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2aa0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2ab0: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2ac0: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2ad0: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2ae0: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2af0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2b00: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2b10: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2b20: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2b30: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2b40: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2b50: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2b60: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2b70: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2b80: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2b90: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2ba0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2bb0: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2bc0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2bd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2be0: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2c00: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2c10: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2c20: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2c30: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2c40: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2c50: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2c60: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2c70: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2c80: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2c90: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2ca0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2cb0: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2cc0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2cd0: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2ce0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2cf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2d00: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2d10: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2d20: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2d30: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2d40: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2d50: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2d60: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2d70: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2d80: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2d90: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2da0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2db0: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2dc0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2dd0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2de0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2df0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2e00: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2e10: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2e20: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2e30: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2e40: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2e50: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2e60: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2e70: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2e80: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2e90: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ea0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
2eb0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
2ec0: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
2ed0: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
2ee0: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
2ef0: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
2f00: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
2f10: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
2f20: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
2f30: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
2f40: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2f50: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
2f60: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
2f70: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
2f80: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
2f90: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
2fa0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2fb0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2fc0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2fd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2fe0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2ff0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3000: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3010: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3020: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3030: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3040: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
3050: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
3060: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
3070: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
3080: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
3090: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
30a0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
30b0: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
30c0: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
30d0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
30e0: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
30f0: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3100: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3110: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3120: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3130: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3140: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
3150: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
3160: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
3170: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
3180: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
3190: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
31a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
31b0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
31c0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
31d0: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
31e0: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
31f0: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3200: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3210: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3220: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3230: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3240: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3250: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
3260: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
3270: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
3280: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
3290: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
32a0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
32b0: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
32c0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
32d0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
32e0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
32f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3300: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3310: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3320: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3330: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3340: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3350: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
3360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3370: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
3380: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
3390: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
33a0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
33b0: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
33c0: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
33d0: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
33e0: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
33f0: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3400: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3410: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3420: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3430: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3440: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
3450: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
3460: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
3470: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
3480: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
3490: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
34a0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
34b0: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
34c0: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
34d0: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
34e0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
34f0: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3500: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3510: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3520: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3530: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3540: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
3550: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
3560: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
3570: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
3580: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
3590: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
35a0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
35b0: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
35c0: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
35d0: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
35e0: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
35f0: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3600: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3610: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3620: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3630: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3640: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
3650: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3660: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
3670: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
3680: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
3690: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
36a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
36b0: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
36c0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
36d0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
36e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
36f0: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3700: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3710: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3720: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3730: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3740: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3750: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3760: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
3770: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
3780: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
3790: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
37a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
37b0: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
37c0: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
37d0: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
37e0: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
37f0: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3800: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3810: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3820: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3830: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3840: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
3850: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
3860: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
3870: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
3880: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
3890: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
38a0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
38b0: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
38c0: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
38d0: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
38e0: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
38f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3900: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3910: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3920: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3930: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3940: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3950: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3960: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3970: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3980: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3990: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
39a0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
39b0: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
39c0: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
39d0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
39e0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
39f0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3a00: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3a10: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3a20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3a30: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3a40: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3a50: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3a60: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3a70: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3a80: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3a90: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3aa0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3ab0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3ac0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3ad0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3ae0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3af0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3b00: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3b10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3b20: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3b30: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3b40: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3b50: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3b60: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3b70: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3b80: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3b90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3ba0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3bb0: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3bc0: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3bd0: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3be0: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3bf0: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3c00: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3c10: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3c20: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3c30: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3c40: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3c50: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3c60: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3c70: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3c80: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3c90: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3ca0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3cb0: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3cc0: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3cd0: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3ce0: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3cf0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3d00: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3d10: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3d20: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3d30: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3d40: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3d50: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3d60: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3d70: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3d80: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3d90: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3da0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3db0: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3dc0: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3de0: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3df0: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3e00: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3e10: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3e20: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3e30: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e50: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3e60: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3e70: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3e80: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3e90: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ea0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
3eb0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
3ec0: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
3ed0: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
3ee0: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
3ef0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
3f00: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
3f10: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
3f20: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
3f30: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
3f40: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
3f50: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
3f60: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
3f70: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
3f80: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
3f90: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
3fa0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
3fb0: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
3fc0: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
3fd0: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
3fe0: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
3ff0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4000: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4010: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4020: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4030: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4040: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
4050: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
4060: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4070: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
4080: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
4090: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
40a0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
40b0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
40c0: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
40d0: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
40e0: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
40f0: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4100: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4110: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4120: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4130: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4140: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
4150: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
4160: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
4170: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
4180: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
4190: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
41a0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
41b0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
41c0: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
41d0: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
41e0: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
41f0: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4200: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4210: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4220: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4230: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4240: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
4250: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
4260: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4270: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
4280: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
4290: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
42a0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
42b0: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
42c0: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
42d0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
42e0: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
42f0: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4300: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4310: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4320: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4330: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4340: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
4350: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
4360: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
4370: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
4380: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
4390: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
43a0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
43b0: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
43c0: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
43d0: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
43e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
43f0: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4400: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4410: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4420: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4430: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4440: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
4450: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
4460: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
4470: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
4480: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
4490: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
44a0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
44b0: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
44c0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
44d0: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
44e0: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
44f0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4500: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4510: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4520: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4530: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4540: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
4550: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
4560: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
4570: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
4580: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
4590: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
45a0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
45b0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
45c0: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
45d0: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
45e0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
45f0: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4600: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4610: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4620: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4630: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4640: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
4650: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
4660: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4670: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
4680: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
4690: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
46a0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
46b0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
46c0: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
46d0: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
46e0: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
46f0: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4700: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4710: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4720: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4730: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4740: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
4750: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
4760: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
4770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4780: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
4790: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
47a0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
47b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
47c0: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
47d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
47e0: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
47f0: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4800: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4810: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4820: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4830: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4840: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4850: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
4860: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4870: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
4880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
4890: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
48a0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
48b0: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
48c0: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
48d0: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
48e0: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
48f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4900: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4910: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4920: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4930: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4940: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4950: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4960: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4970: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4980: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4990: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
49a0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
49b0: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
49c0: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
49d0: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
49e0: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
49f0: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4a00: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4a10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4a20: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4a30: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4a40: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4a50: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4a60: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4a70: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4a80: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4a90: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4aa0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4ab0: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4ac0: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4ad0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4ae0: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4af0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4b00: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4b10: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4b20: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4b30: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4b40: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4b50: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4b60: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4b70: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4b80: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4b90: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4ba0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4bb0: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4bc0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4bd0: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4be0: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4bf0: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4c00: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4c10: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
4c20: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
4c30: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
4c40: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4c50: 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
4c60: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
4c70: 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74 65  alid (has eState
4c80: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  ==CURSOR_VALID).
4c90: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
4ca0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
4cb0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
4cc0: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
4cd0: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
4ce0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
4cf0: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
4d00: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
4d10: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
4d20: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
4d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
4d40: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
4d50: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
4d60: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
4d70: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
4d80: 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  >nKey);.  assert
4d90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4da0: 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29  );  /* KeySize()
4db0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
4dc0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
4dd0: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
4de0: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
4df0: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
4e00: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
4e10: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
4e20: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
4e30: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
4e40: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
4e50: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
4e60: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
4e70: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
4e80: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
4e90: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
4ea0: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
4eb0: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
4ec0: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
4ed0: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
4ee0: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
4ef0: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50  if( 0==pCur->apP
4f00: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
4f10: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
4f20: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
4f30: 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  ( (int)pCur->nKe
4f40: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  y );.    if( pKe
4f50: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
4f60: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
4f70: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
4f80: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
4f90: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
4fa0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4fb0: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
4fc0: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
4fd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4fe0: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
4ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5000: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
5010: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5020: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5030: 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  !pCur->apPage[0]
5040: 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  ->intKey || !pCu
5050: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
5060: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5070: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5080: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
5090: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
50a0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
50b0: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
50c0: 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  i]);.      pCur-
50d0: 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
50e0: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
50f0: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20  iPage = -1;.    
5100: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5110: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5120: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5130: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5140: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
5150: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5160: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
5170: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
5180: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
5190: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
51a0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
51b0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
51c0: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
51d0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
51e0: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
51f0: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
5200: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
5210: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
5220: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5230: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
5240: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
5250: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
5260: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
5270: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
5280: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
5290: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
52a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
52b0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
52c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
52d0: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
52e0: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
52f0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
5300: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5310: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
5320: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
5330: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
5340: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
5350: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
5360: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5370: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
5380: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
5390: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
53a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
53b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
53c0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
53d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
53e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
53f0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
5400: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5410: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
5420: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
5430: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
5440: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
5450: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5460: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5470: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
5480: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
5490: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
54a0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
54b0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
54c0: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
54d0: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
54e0: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
54f0: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
5500: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
5510: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
5520: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
5530: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
5540: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
5550: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
5560: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
5570: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
5580: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
5590: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
55a0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
55b0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
55c0: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
55d0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
55e0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
55f0: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
5600: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
5610: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5620: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5630: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5640: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
5650: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
5660: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
5670: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
5680: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
5690: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
56a0: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
56b0: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
56c0: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
56d0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
56e0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5700: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
5710: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5720: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5730: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5740: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
5750: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
5760: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
5770: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
5780: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
5790: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65   */.  char *pFre
57a0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b  e = 0;..  if( pK
57b0: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
57c0: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
57d0: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
57e0: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
57f0: 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
5800: 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20  Record(.        
5810: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5820: 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
5830: 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20  Space), &pFree. 
5840: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49     );.    if( pI
5850: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
5860: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
5880: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
5890: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
58a0: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
58b0: 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xKey);.  }else{.
58c0: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
58d0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
58e0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
58f0: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
5900: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
5910: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
5920: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
5930: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
5940: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
5950: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
5960: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5970: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5980: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5990: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
59a0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
59b0: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
59c0: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
59d0: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
59e0: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
59f0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
5a00: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
5a10: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
5a20: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
5a30: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
5a40: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5a50: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5a60: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5a70: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5a80: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5a90: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5aa0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5ab0: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5ac0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5ad0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5ae0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5af0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5b00: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5b10: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5b20: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5b30: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
5b40: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5b50: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5b60: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5b70: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5b80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5b90: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5ba0: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5bb0: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5bc0: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5bd0: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5be0: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5bf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5c10: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5c20: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5c30: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5c40: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5c50: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5c60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5c70: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5c80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5c90: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5ca0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5cb0: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5cc0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5cd0: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5ce0: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5cf0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5d00: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5d10: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5d20: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5d30: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5d40: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5d50: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5d60: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5d70: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5d80: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5d90: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5da0: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5db0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5dc0: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5dd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5de0: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5df0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5e00: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5e10: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5e20: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5e30: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5e40: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5e50: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5e60: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5e70: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5e80: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5e90: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5ea0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5eb0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5ec0: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5ed0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5ee0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5ef0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5f00: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5f10: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5f20: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5f30: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5f40: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5f50: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5f60: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5f70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5f80: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5f90: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5fa0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5fb0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5fc0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5fd0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5fe0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ff0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
6000: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
6010: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
6020: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
6030: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
6040: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
6050: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
6060: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
6070: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
6080: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
6090: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
60a0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
60b0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
60c0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
60d0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
60e0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
60f0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
6100: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
6110: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
6120: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
6130: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
6140: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
6150: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6160: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6170: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6180: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6190: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
61a0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
61b0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
61c0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
61d0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
61e0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
61f0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
6200: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
6210: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
6220: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
6230: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
6240: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6250: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
6260: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
6270: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6280: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6290: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
62a0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
62b0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
62c0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
62d0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
62e0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
62f0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6300: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
6310: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
6320: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
6330: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
6340: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6350: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
6360: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6370: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6380: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6390: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
63a0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
63b0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
63c0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
63d0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
63e0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
63f0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
6400: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
6410: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6420: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
6430: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
6440: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6450: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6460: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6470: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6480: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6490: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
64a0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
64b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
64c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
64d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
64e0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
64f0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
6500: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
6510: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
6520: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6530: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6540: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6550: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6560: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6570: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6580: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6590: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
65a0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
65b0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
65c0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
65d0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
65e0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
65f0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
6600: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6610: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
6620: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
6630: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6640: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6650: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6660: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6670: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6680: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6690: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
66a0: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
66b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
66c0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
66d0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
66e0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
66f0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
6700: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6710: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6720: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6730: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6740: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6750: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6760: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6770: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6780: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6790: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
67a0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
67b0: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
67c0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
67d0: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
67e0: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
67f0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
6800: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
6810: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
6820: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
6830: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6840: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6850: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6860: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6870: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6880: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6890: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
68a0: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
68b0: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
68c0: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
68d0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
68e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
68f0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
6900: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
6910: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6920: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
6930: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6940: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6950: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6960: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6970: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6980: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6990: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
69a0: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
69b0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
69c0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
69d0: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
69e0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
69f0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
6a00: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6a10: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
6a20: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
6a30: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6a40: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6a50: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6a60: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6a70: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6a80: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6a90: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6aa0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6ab0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6ac0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6ad0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
6ae0: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
6af0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
6b00: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
6b10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6b20: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6b30: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
6b40: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6b50: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6b70: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6b80: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6b90: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6ba0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6bb0: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6bc0: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6bd0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6be0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
6bf0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6c00: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6c10: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6c20: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
6c30: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6c40: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
6c50: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6c60: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
6c70: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6c80: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6c90: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
6ca0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
6cb0: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
6cc0: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
6cd0: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
6ce0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
6cf0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6d00: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
6d10: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6d20: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
6d30: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
6d40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6d50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
6d60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6d70: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
6d80: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
6d90: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
6da0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6db0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
6dc0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6dd0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6de0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6df0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6e00: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
6e10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
6e20: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
6e30: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
6e40: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
6e50: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
6e60: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
6e70: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6e80: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6e90: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6ea0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
6eb0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
6ec0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
6ed0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
6ee0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
6ef0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
6f00: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
6f10: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
6f20: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
6f30: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
6f40: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43  et2byte(&(P)->aC
6f50: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
6f60: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
6f70: 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b  lv2(D,M,O,I) (D+
6f80: 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f  (M&get2byte(D+(O
6f90: 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a  +2*(I))))).../*.
6fa0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6fb0: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6fc0: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6fd0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6fe0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6ff0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7000: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
7010: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
7020: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
7030: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
7040: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
7050: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7060: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7070: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
7080: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
7090: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
70a0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
70b0: 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69     k = pPage->ai
70c0: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Ovfl[i];.    if(
70d0: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
70e0: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
70f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7100: 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
7110: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
7120: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
7130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
7140: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
7150: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
7160: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
7170: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
7180: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
7190: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
71a0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
71b0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
71c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65   function.  btre
71d0: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
71e0: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
71f0: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
7200: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62  d argument and b
7210: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7220: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
7230: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
7240: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
7250: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
7260: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
7270: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
7280: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
7290: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
72a0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
72b0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
72c0: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
72d0: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
72e0: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
72f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7300: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7310: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
7320: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7330: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7340: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
7350: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
7360: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
7370: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
7380: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
7390: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
73a0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
73b0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
73c0: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
73d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
73e0: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
73f0: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
7400: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
7410: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
7420: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7430: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
7440: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
7450: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7460: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
7470: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
7480: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
7490: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
74a0: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
74b0: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
74c0: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
74d0: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
74e0: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
74f0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
7500: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
7510: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
7520: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
7530: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7540: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7550: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
7560: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
7570: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
7580: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
7590: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
75a0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
75b0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
75c0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
75d0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
75e0: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
75f0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7600: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7610: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
7620: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
7630: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
7640: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
7650: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
7660: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73  eader = n;.  tes
7670: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
7680: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
7690: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
76a0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
76b0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
76c0: 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79   if( likely(nPay
76d0: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
76e0: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
76f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
7700: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
7710: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
7720: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
7730: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
7740: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
7750: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
7760: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
7770: 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d   (pInfo->nSize =
7780: 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61   (u16)(n+nPayloa
7790: 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  d))<4 ) pInfo->n
77a0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
77b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
77c0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
77d0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
77e0: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
77f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
7800: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
7810: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
7820: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
7830: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
7840: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
7850: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
7860: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
7870: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
7880: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
7890: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
78a0: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
78b0: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
78c0: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
78d0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
78e0: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
78f0: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
7900: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
7910: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
7920: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
7930: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
7940: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
7950: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
7960: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
7970: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
7980: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
7990: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
79a0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
79b0: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
79c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
79d0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
79e0: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
79f0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7a00: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7a10: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
7a20: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
7a30: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7a40: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7a50: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
7a60: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
7a70: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
7a80: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
7a90: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
7aa0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
7ab0: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
7ac0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
7ad0: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
7ae0: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
7af0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
7b00: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7b10: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7b20: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7b30: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
7b40: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72     testcase( sur
7b50: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
7b60: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70   );.    if( surp
7b70: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
7b80: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
7b90: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
7ba0: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
7bb0: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7bc0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
7bd0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
7be0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7bf0: 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d  w = (u16)(pInfo-
7c00: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20  >nLocal + n);.  
7c10: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7c20: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7c30: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
7c40: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
7c50: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
7c60: 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72  fo) \.  btreePar
7c70: 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65  seCellPtr((pPage
7c80: 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61  ), findCell((pPa
7c90: 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28  ge), (iCell)), (
7ca0: 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76  pInfo)).static v
7cb0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7cc0: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
7cd0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7ce0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7cf0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
7d00: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
7d10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
7d20: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
7d30: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
7d40: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7d50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
7d60: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
7d70: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
7d80: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
7d90: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
7da0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
7db0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
7dc0: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
7dd0: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
7de0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
7df0: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
7e00: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
7e10: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
7e20: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7e30: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
7e40: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
7e50: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
7e60: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
7e70: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
7e80: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
7e90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  ..*/.static u16 
7ea0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
7eb0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
7ec0: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
7ed0: 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61  ter = &pCell[pPa
7ee0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7ef0: 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  ];.  u32 nSize;.
7f00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7f10: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
7f20: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
7f30: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
7f40: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
7f50: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
7f60: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
7f70: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
7f80: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
7f90: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
7fa0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
7fb0: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
7fc0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
7fd0: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
7fe0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
7ff0: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
8000: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
8010: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
8020: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
8030: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74   debuginfo;.  bt
8040: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
8050: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
8060: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
8070: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
8080: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38  intKey ){.    u8
8090: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20   *pEnd;.    if( 
80a0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
80b0: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d  {.      pIter +=
80c0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
80d0: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20  er, nSize);.    
80e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
80f0: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 0;.    }.. 
8100: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
8110: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
8120: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
8130: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
8140: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
8150: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
8160: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
8170: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
8180: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
8190: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
81a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
81b0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
81c0: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
81d0: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
81e0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
81f0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
8200: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8210: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8220: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8230: 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  ;.  }..  testcas
8240: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8250: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
8260: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8270: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
8280: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
8290: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
82a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   ){.    int minL
82b0: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
82c0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
82d0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
82e0: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
82f0: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
8300: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
8310: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8320: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8330: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
8340: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8350: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
8360: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
8370: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
8380: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
8390: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
83a0: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
83b0: 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b  4;.  }.  nSize +
83c0: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
83d0: 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68  pCell);..  /* Th
83e0: 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
83f0: 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20  f any cell is 4 
8400: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20  bytes. */.  if( 
8410: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e  nSize<4 ){.    n
8420: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  Size = 4;.  }.. 
8430: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
8440: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
8450: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
8460: 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65  )nSize;.}..#ifde
8470: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8480: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
8490: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
84a0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
84b0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
84c0: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
84d0: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
84e0: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
84f0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
8500: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
8510: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
8520: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8530: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
8540: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
8550: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
8560: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
8570: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
8580: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
8590: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
85a0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
85b0: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
85c0: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
85d0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
85e0: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
85f0: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
8600: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8610: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
8620: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
8630: 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  l, int *pRC){.  
8640: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
8650: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
8660: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rn;.  assert( pC
8670: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65  ell!=0 );.  btre
8680: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8690: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
86a0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
86b0: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
86c0: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
86d0: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
86e0: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
86f0: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
8700: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
8710: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
8720: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
8730: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
8740: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
8750: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
8760: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
8770: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
8780: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
8790: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
87a0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
87b0: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
87c0: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
87d0: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
87e0: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
87f0: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8800: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8810: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8820: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
8830: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
8840: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
8850: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8860: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
8870: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
8880: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
8890: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
88c0: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
88f0: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8900: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8920: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
8930: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
8940: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
8950: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8960: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
8970: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
8980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8990: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
89a0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
89b0: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
89c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
89d0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
89e0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
89f0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8a20: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8a30: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
8a40: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
8a50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8a60: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
8a70: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
8a80: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8a90: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8aa0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8ab0: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8ac0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8ad0: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8ae0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8af0: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8b00: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8b10: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8b20: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
8b30: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
8b40: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
8b50: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
8b60: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8b70: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8b80: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8b90: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8ba0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8bb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8bc0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8bd0: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8be0: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8bf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8c00: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8c10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8c20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8c30: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8c40: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
8c50: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
8c60: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
8c70: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
8c80: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8c90: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8ca0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8cb0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8cc0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8cd0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8ce0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8cf0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8d00: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8d10: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8d20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8d30: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
8d40: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8d50: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
8d60: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
8d70: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
8d80: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
8d90: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
8da0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
8db0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
8dc0: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
8dd0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
8de0: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
8df0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8e00: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8e10: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8e20: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8e30: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
8e40: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
8e50: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
8e60: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
8e70: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8e80: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8e90: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8ea0: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
8eb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8ec0: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
8ed0: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
8ee0: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
8ef0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
8f00: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
8f10: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
8f20: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
8f30: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
8f40: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
8f50: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
8f60: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
8f70: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
8f80: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
8f90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8fa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
8fb0: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
8fc0: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
8fd0: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
8fe0: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
8ff0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9000: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
9010: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
9020: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9030: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9040: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
9050: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
9060: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
9070: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9080: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9090: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
90a0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
90b0: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
90c0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
90d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
90e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
90f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
9100: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
9110: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
9120: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
9130: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9140: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
9150: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
9160: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
9170: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
9180: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9190: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
91a0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
91b0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
91c0: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
91d0: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
91e0: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
91f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
9200: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
9210: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
9220: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
9230: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
9240: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
9250: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
9260: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
9270: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9280: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9290: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
92a0: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
92b0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
92c0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
92d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
92e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
92f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9300: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
9310: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
9320: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
9330: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
9340: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
9350: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9360: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
9370: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
9380: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
9390: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
93a0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
93b0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
93c0: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
93d0: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
93e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
93f0: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
9400: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
9410: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
9420: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
9430: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9440: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
9450: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
9460: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
9470: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
9480: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
9490: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
94a0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
94b0: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
94c0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
94d0: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
94e0: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
94f0: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
9500: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
9510: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
9520: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
9530: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
9540: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
9550: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
9560: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
9570: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
9580: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
9590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
95a0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
95b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
95c0: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
95d0: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
95e0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
95f0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
9600: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
9610: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
9620: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
9630: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9640: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
9650: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
9660: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
9670: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
96a0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
96b0: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
96c0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
96f0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
9700: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
9710: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
9720: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
9730: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
9740: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
9750: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
9760: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
9770: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
9780: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
9790: 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
97a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
97b0: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
97c0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
97d0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
97e0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
97f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9800: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9810: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9820: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9830: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9840: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
9850: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
9860: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
9870: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
9880: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
9890: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
98a0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
98b0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
98c0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
98d0: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
98e0: 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a  Byte < usableSiz
98f0: 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20  e-8 );..  nFrag 
9900: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
9910: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9920: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
9930: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
9940: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
9950: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9960: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
9970: 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65  Cell;.  top = ge
9980: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9990: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
99a0: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
99b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
99c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
99d0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
99e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
99f0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
9a00: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9a10: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9a20: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9a30: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9a40: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9a50: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9a60: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9a70: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9a80: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9a90: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9aa0: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9ab0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9ac0: 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c  }else if( gap+2<
9ad0: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =top ){.    /* S
9ae0: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
9af0: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9b00: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9b10: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9b20: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
9b30: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
9b40: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
9b50: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
9b60: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
9b70: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
9b80: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
9b90: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
9ba0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
9bb0: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
9bc0: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
9bd0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
9be0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
9bf0: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
9c00: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
9c10: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9c20: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
9c30: 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62       if( pc>usab
9c40: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61  leSize-4 || pc<a
9c50: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  ddr+4 ){.       
9c60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9c70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9c80: 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20     }.      size 
9c90: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9ca0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
9cb0: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
9cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
9cd0: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
9ce0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9cf0: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
9d00: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
9d10: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9d20: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x<4 ){.         
9d30: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
9d40: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
9d50: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
9d60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
9d70: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
9d80: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
9d90: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
9da0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
9db0: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61  &data[addr], &da
9dc0: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
9dd0: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
9de0: 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b  ] = (u8)(nFrag +
9df0: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   x);.        }el
9e00: 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e  se if( size+pc >
9e10: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
9e20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9e30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9e40: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
9e50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
9e60: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
9e70: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
9e80: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
9e90: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
9ea0: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
9eb0: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
9ec0: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
9ed0: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
9ee0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
9ef0: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
9f00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9f10: 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b   *pIdx = pc + x;
9f20: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9f30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
9f40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9f50: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
9f60: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65   sure there is e
9f70: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74  nough space in t
9f80: 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66  he gap to satisf
9f90: 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63  y.  ** the alloc
9fa0: 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20  ation.  If not, 
9fb0: 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f  defragment..  */
9fc0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9fd0: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
9fe0: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
9ff0: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63  te>top ){.    rc
a000: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
a010: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
a020: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a030: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a040: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
a050: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
a060: 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65  ssert( gap+nByte
a070: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
a080: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
a090: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
a0a0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a0b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a0c0: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
a0d0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a0e0: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
a0f0: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
a100: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
a110: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
a120: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
a130: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
a140: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
a150: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
a160: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
a170: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
a180: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a190: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
a1a0: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
a1b0: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
a1c0: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
a1d0: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
a1e0: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
a1f0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
a200: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
a210: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
a220: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a230: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
a240: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
a250: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a260: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
a270: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
a280: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
a290: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
a2a0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a2b0: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
a2c0: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
a2d0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
a2e0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a2f0: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
a300: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
a310: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
a320: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
a330: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
a340: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
a350: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
a360: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
a370: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
a380: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
a390: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a3a0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
a3b0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
a3c0: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74  egin, hdr;.  int
a3d0: 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a3f0: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
a400: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
a410: 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  set */.  unsigne
a420: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
a430: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
a440: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a450: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
a460: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a470: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a480: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a490: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
a4a0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
a4b0: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
a4c0: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
a4d0: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
a4e0: 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  ) <= (int)pPage-
a4f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a510: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a520: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a530: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a540: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
a550: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
a560: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66  ze is 4 */..  if
a570: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
a580: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
a590: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
a5a0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
a5b0: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
a5c0: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
a5d0: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
a5e0: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
a5f0: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
a600: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
a610: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a620: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
a630: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
a640: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
a650: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
a660: 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  cks.  Note that.
a670: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
a680: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
a690: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
a6a0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
a6b0: 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e  (),.  ** btreeIn
a6c0: 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74  itPage() did not
a6d0: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70   detect overlapp
a6e0: 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a  ing cells or.  *
a6f0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  * freeblocks tha
a700: 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c  t overlapped cel
a710: 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69  ls.   Nor does i
a720: 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  t detect when th
a730: 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74  e.  ** cell cont
a740: 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73  ent area exceeds
a750: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a760: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
a770: 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69  If these.  ** si
a780: 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20  tuations arise, 
a790: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
a7a0: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
a7b0: 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a  s might corrupt.
a7c0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a7d0: 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65  t.  So we do nee
a7e0: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63  d to check for c
a7f0: 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20  orruption while 
a800: 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68  scanning.  ** th
a810: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
a820: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
a830: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
a840: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
a850: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
a860: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
a870: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  4;.  assert( sta
a880: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77  rt<=iLast );.  w
a890: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
a8a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
a8b0: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
a8c0: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
a8d0: 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b  if( pbegin<addr+
a8e0: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
a8f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a900: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
a910: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
a920: 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e    }.  if( pbegin
a930: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
a940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a950: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
a960: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
a970: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
a980: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
a990: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
a9a0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
a9b0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
a9c0: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
a9d0: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
a9e0: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
a9f0: 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
aa00: 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a  nFree + (u16)siz
aa10: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
aa20: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
aa30: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
aa40: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
aa50: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
aa60: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
aa70: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
aa80: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
aa90: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
aaa0: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
aab0: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
aac0: 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  n <= (int)pPage-
aad0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
aae0: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
aaf0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ab00: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
ab10: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ab20: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ab30: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
ab40: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
ab50: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
ab60: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
ab70: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
ab80: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
ab90: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
aba0: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
abb0: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
abc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
abd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
abe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
abf0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
ac00: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
ac10: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ac20: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
ac30: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ac40: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
ac50: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
ac60: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
ac70: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
ac80: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
ac90: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
aca0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
acb0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
acc0: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
acd0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
ace0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
acf0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
ad00: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
ad10: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
ad20: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
ad30: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
ad40: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
ad50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
ad60: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
ad70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ad80: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
ad90: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
ada0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
adb0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
adc0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
add0: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
ade0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
adf0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
ae00: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
ae10: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
ae20: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
ae30: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
ae40: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
ae50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ae60: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
ae70: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
ae80: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
ae90: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aea0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
aeb0: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
aec0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
aed0: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
aee0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
aef0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
af00: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
af10: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
af20: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
af30: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
af40: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
af50: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
af60: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
af70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
af80: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
af90: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
afa0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
afb0: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
afc0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
afd0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
afe0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
aff0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
b000: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
b010: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
b020: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b030: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
b040: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
b050: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b060: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
b070: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b080: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
b090: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b0a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b0b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b0c0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b0d0: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
b0e0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
b0f0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
b100: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
b110: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
b120: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b130: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
b140: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
b150: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
b160: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
b170: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b180: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
b190: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
b1a0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b1b0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
b1c0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b1d0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
b1e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b1f0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b200: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
b210: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
b220: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
b230: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b240: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
b250: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
b260: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b270: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
b280: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b290: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
b2a0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
b2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b2c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b2d0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
b2e0: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
b2f0: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b300: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
b310: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b320: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b330: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b340: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b350: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
b360: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
b370: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
b380: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
b390: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
b3a0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
b3b0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
b3c0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
b3d0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
b3e0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
b3f0: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
b400: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
b410: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
b420: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
b430: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
b440: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
b450: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
b460: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
b470: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
b480: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
b490: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
b4a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b4b0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
b4c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b4d0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b4e0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b4f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b500: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
b510: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
b520: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b530: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b540: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b550: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
b560: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b570: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
b580: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
b590: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
b5a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
b5b0: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
b5c0: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
b5d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b5e0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
b5f0: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
b600: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
b610: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
b620: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b630: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
b640: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
b650: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
b660: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
b670: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
b680: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
b690: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
b6a0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
b6b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
b6c0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
b6d0: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
b6e0: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
b6f0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
b700: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
b710: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
b720: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
b730: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
b740: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
b750: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
b760: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
b770: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
b780: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
b790: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
b7a0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
b7b0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
b7c0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
b7d0: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
b7e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
b7f0: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
b800: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
b810: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
b820: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
b830: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
b840: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
b850: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
b860: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
b870: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b880: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
b890: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b8a0: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
b8b0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
b8c0: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
b8d0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b8e0: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
b8f0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
b900: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
b910: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
b920: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
b930: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
b940: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
b950: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
b960: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
b970: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
b980: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
b990: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
b9a0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
b9b0: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
b9c0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
b9d0: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
b9e0: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
b9f0: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
ba00: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
ba10: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
ba20: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
ba30: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
ba40: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
ba50: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
ba60: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
ba70: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
ba80: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
ba90: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
baa0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
bab0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
bac0: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
bad0: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
bae0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
baf0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bb00: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
bb10: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
bb20: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
bb30: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
bb40: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
bb50: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
bb60: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
bb70: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
bb80: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
bb90: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
bba0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
bbb0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
bbc0: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
bbd0: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
bbe0: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
bbf0: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
bc00: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
bc10: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
bc20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
bc30: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
bc40: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
bc50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
bc60: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
bc70: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
bc80: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
bc90: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
bca0: 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65   - 4;.#if define
bcb0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
bcc0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
bcd0: 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ECK).    {.     
bce0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
bcf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
bd00: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
bd10: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
bd20: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
bd30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
bd40: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
bd50: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
bd60: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
bd70: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bd80: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
bd90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
bda0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bdb0: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
bdc0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bdd0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
bde0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
bdf0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
be00: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
be10: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
be20: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
be30: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
be40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
be50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
be60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
be70: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
be80: 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
be90: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bea0: 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
beb0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
bec0: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
bed0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
bee0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bef0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bf00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bf10: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
bf20: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
bf30: 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23  ast++;.    }  .#
bf40: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
bf50: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
bf60: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
bf70: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
bf80: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bf90: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
bfa0: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
bfb0: 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68  7] + top;.    wh
bfc0: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
bfd0: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
bfe0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
bff0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c000: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c010: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
c020: 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  f free block is 
c030: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
c040: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c050: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c060: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c070: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
c080: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
c090: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
c0a0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
c0b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
c0c0: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
c0d0: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
c0e0: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c0f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
c100: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c110: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
c120: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
c130: 74 20 62 79 74 65 20 6f 66 0a 09 2a 2a 20 74 68  t byte of..** th
c140: 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73  e free-block mus
c150: 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74  t lie on the dat
c160: 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a  abase page.  */.
c170: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c180: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c190: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c1a0: 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65     nFree = nFree
c1b0: 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70   + size;.      p
c1c0: 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a  c = next;.    }.
c1d0: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
c1e0: 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
c1f0: 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
c200: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
c210: 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  he start.    ** 
c220: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
c230: 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20 74 68  ent area plus th
c240: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
c250: 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20   bytes within.  
c260: 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f    ** the cell-co
c270: 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74  ntent area. If t
c280: 68 69 73 20 69 73 20 67 72 65 61 74 65 72 20 74  his is greater t
c290: 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73  han the usable-s
c2a0: 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ize.    ** of th
c2b0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
c2c0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
c2d0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 63 68  rrupted. This ch
c2e0: 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20  eck also.    ** 
c2f0: 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79  serves to verify
c300: 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74   that the offset
c310: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
c320: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
c330: 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61  t.    ** area, a
c340: 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
c350: 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65  page header, lie
c360: 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
c370: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
c380: 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69  ( nFree>usableSi
c390: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ze ){.      retu
c3a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c3b0: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
c3c0: 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
c3d0: 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20  = (u16)(nFree - 
c3e0: 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20  iCellFirst);.   
c3f0: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
c400: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
c410: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
c420: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61  *.** Set up a ra
c430: 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69  w page so that i
c440: 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64  t looks like a d
c450: 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c  atabase page hol
c460: 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69  ding.** no entri
c470: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
c480: 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50  id zeroPage(MemP
c490: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
c4a0: 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e  flags){.  unsign
c4b0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
c4c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
c4d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
c4e0: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38  pPage->pBt;.  u8
c4f0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
c500: 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66  rOffset;.  u16 f
c510: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
c520: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
c530: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
c540: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
c550: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
c560: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
c570: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
c580: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
c590: 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
c5a0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c5b0: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
c5c0: 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20  DbPage) == data 
c5d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c5e0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
c5f0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
c600: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
c610: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c620: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
c630: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62   );.  if( pBt->b
c640: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
c650: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
c660: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
c670: 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73  hdr], 0, pBt->us
c680: 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b  ableSize - hdr);
c690: 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d  .  }.  data[hdr]
c6a0: 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a   = (char)flags;.
c6b0: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
c6c0: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
c6d0: 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29  F_LEAF)==0 ?1:0)
c6e0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
c6f0: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
c700: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
c710: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
c720: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
c730: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
c740: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
c750: 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
c760: 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
c770: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
c780: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
c790: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d  age->hdrOffset =
c7a0: 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63   hdr;.  pPage->c
c7b0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73  ellOffset = firs
c7c0: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  t;.  pPage->aDat
c7d0: 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74  aEnd = &data[pBt
c7e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20  ->usableSize];. 
c7f0: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
c800: 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b   = &data[first];
c810: 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
c820: 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  low = 0;.  asser
c830: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
c840: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
c850: 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b  geSize<=65536 );
c860: 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  .  pPage->maskPa
c870: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
c880: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
c890: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
c8a0: 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  0;.  pPage->isIn
c8b0: 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  it = 1;.}.../*.*
c8c0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61  * Convert a DbPa
c8d0: 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
c8e0: 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20   the pager into 
c8f0: 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62  a MemPage used b
c900: 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c  y.** the btree l
c910: 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ayer..*/.static 
c920: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
c930: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50  geFromDbPage(DbP
c940: 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67  age *pDbPage, Pg
c950: 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65  no pgno, BtShare
c960: 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
c970: 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d  ge *pPage = (Mem
c980: 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
c990: 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
c9a0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  ge);.  pPage->aD
c9b0: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
c9c0: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
c9d0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62  e);.  pPage->pDb
c9e0: 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a  Page = pDbPage;.
c9f0: 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
ca00: 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e  Bt;.  pPage->pgn
ca10: 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67  o = pgno;.  pPag
ca20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
ca30: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20  Page->pgno==1 ? 
ca40: 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  100 : 0;.  retur
ca50: 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
ca60: 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
ca70: 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
ca80: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
ca90: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
caa0: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
cab0: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
cac0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
cad0: 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69  noContent flag i
cae0: 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
caf0: 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
cb00: 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65  are about.** the
cb10: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
cb20: 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
cb30: 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
cb40: 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
cb50: 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
cb60: 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
cb70: 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
cb80: 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
cb90: 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
cba0: 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
cbb0: 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
cbc0: 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
cbd0: 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
cbe0: 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
cbf0: 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
cc00: 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
cc10: 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
cc20: 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
cc30: 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
cc40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
cc50: 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
cc60: 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
cc70: 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
cc80: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
cc90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
cca0: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
ccb0: 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
ccc0: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
ccd0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
cce0: 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
ccf0: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
cd00: 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20  noContent       
cd10: 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64 20   /* Do not load 
cd20: 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66 20  page content if 
cd30: 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  true */.){.  int
cd40: 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70   rc;.  DbPage *p
cd50: 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
cd60: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
cd70: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
cd80: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
cd90: 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
cda0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
cdb0: 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
cdc0: 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74  bPage, noContent
cdd0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
cde0: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61  turn rc;.  *ppPa
cdf0: 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46 72  ge = btreePageFr
ce00: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
ce10: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
ce20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ce30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69  ;.}../*.** Retri
ce40: 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20  eve a page from 
ce50: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
ce60: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
ce70: 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a  d page is not.**
ce80: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
ce90: 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74 75  pager cache retu
cea0: 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c  rn NULL. Initial
ceb0: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
cec0: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
ced0: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
cee0: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  s if needed..*/.
cef0: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
cf00: 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
cf10: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
cf20: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50  gno pgno){.  DbP
cf30: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
cf40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cf50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cf60: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50  mutex) );.  pDbP
cf70: 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
cf80: 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
cf90: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
cfa0: 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
cfb0: 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61    return btreePa
cfc0: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
cfd0: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
cfe0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
cff0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
d000: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
d010: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d020: 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68 65  in pages. If the
d030: 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f  re is any kind o
d040: 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75  f.** error, retu
d050: 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  rn ((unsigned in
d060: 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  t)-1)..*/.static
d070: 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63   Pgno btreePagec
d080: 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  ount(BtShared *p
d090: 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42  Bt){.  return pB
d0a0: 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20  t->nPage;.}.u32 
d0b0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
d0c0: 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Page(Btree *p){.
d0d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d0e0: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
d0f0: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
d100: 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65   ((p->pBt->nPage
d110: 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30 20  )&0x8000000)==0 
d120: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74  );.  return (int
d130: 29 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  )btreePagecount(
d140: 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pBt);.}../*.*
d150: 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
d160: 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
d170: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20  initialize it.  
d180: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
d190: 6a 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e  just a.** conven
d1a0: 69 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72  ience wrapper ar
d1b0: 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61  ound separate ca
d1c0: 6c 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50  lls to btreeGetP
d1d0: 61 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74  age() and .** bt
d1e0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
d1f0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
d200: 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68   occurs, then th
d210: 65 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20  e value *ppPage 
d220: 69 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64  is set to is und
d230: 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61  efined. It.** ma
d240: 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  y remain unchang
d250: 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65  ed, or it may be
d260: 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c   set to an inval
d270: 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  id value..*/.sta
d280: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
d290: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
d2a0: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
d2b0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
d2c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
d2d0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
d2e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
d2f0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
d300: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
d310: 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65  age     /* Write
d320: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
d330: 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
d340: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
d350: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d360: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
d370: 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62  );..  if( pgno>b
d380: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
d390: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  t) ){.    rc = S
d3a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d3b0: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
d3c0: 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
d3d0: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
d3e0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
d3f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d400: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ){.      rc = bt
d410: 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
d420: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
d430: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d440: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
d450: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
d460: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d470: 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  ..  testcase( pg
d480: 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
d490: 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
d4a0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
d4b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
d4c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
d4d0: 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
d4e0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
d4f0: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
d500: 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
d510: 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
d520: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d530: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
d540: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
d550: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
d560: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
d570: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
d580: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
d590: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
d5a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
d5b0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
d5c0: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
d5d0: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
d5e0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
d5f0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
d600: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
d610: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
d620: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d630: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
d640: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
d650: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
d660: 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
d670: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
d680: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
d690: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
d6a0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
d6b0: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
d6c0: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
d6d0: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
d6e0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
d6f0: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
d700: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
d710: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
d720: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
d730: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
d740: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
d750: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d760: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
d770: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
d780: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
d790: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
d7a0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
d7b0: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
d7c0: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
d7d0: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
d7e0: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
d7f0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
d800: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
d810: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
d820: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
d830: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
d840: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
d850: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
d860: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
d870: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
d880: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d890: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
d8a0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
d8b0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
d8c0: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
d8d0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
d8e0: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
d8f0: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
d900: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
d910: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
d920: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
d930: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
d940: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
d950: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
d960: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
d970: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
d980: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
d990: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
d9a0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
d9b0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d9c0: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
d9d0: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
d9e0: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
d9f0: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
da00: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
da10: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
da20: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
da30: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
da40: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
da50: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
da60: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
da70: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
da80: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
da90: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
daa0: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
dab0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
dac0: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
dad0: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
dae0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
daf0: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
db00: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
db10: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
db20: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
db30: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
db40: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
db50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
db60: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
db70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
db80: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
db90: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
dba0: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
dbb0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
dbc0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
dbd0: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
dbe0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
dbf0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
dc00: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
dc10: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
dc20: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
dc30: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
dc40: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
dc50: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
dc60: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
dc70: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
dc80: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
dc90: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
dca0: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
dcb0: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
dcc0: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
dcd0: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
dce0: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
dcf0: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
dd00: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
dd10: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
dd20: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
dd30: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
dd40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
dd50: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
dd60: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
dd70: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
dd80: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
dd90: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
dda0: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
ddb0: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
ddc0: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
ddd0: 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
dde0: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
ddf0: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
de00: 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
de10: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
de20: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
de30: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
de40: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
de50: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
de60: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
de70: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
de80: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
de90: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
dea0: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
deb0: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
dec0: 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
ded0: 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
dee0: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
def0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
df00: 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
df10: 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
df20: 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
df30: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
df40: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
df50: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
df60: 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
df70: 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
df80: 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
df90: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
dfa0: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
dfb0: 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
dfc0: 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
dfd0: 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
dfe0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
dff0: 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
e000: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
e010: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
e020: 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
e030: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
e040: 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
e050: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
e060: 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
e070: 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
e080: 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
e090: 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
e0a0: 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
e0b0: 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
e0c0: 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
e0d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e0e0: 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
e0f0: 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
e100: 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
e110: 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
e120: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
e130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
e140: 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
e150: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
e160: 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
e170: 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
e180: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
e190: 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
e1a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e1b0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
e1c0: 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
e1d0: 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
e1e0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
e1f0: 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
e200: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
e210: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
e220: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
e230: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
e240: 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
e250: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
e260: 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
e270: 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
e280: 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
e290: 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
e2a0: 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
e2b0: 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
e2c0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
e2d0: 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
e2e0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
e2f0: 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
e300: 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
e310: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
e320: 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
e330: 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
e340: 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
e350: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
e360: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
e370: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
e380: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
e390: 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
e3a0: 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
e3b0: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
e3c0: 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
e3d0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
e3e0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
e3f0: 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
e400: 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
e410: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
e420: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
e430: 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30 20  assert( pVfs!=0 
e440: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e450: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e460: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
e470: 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26 30  assert( (flags&0
e480: 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20  xff)==flags );  
e490: 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e   /* flags fit in
e4a0: 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a   8 bits */..  /*
e4b0: 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49   Only a BTREE_SI
e4c0: 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63 61  NGLE database ca
e4d0: 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44  n be BTREE_UNORD
e4e0: 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74  ERED */.  assert
e4f0: 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
e500: 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c  _UNORDERED)==0 |
e510: 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  | (flags & BTREE
e520: 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a  _SINGLE)!=0 );..
e530: 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e    /* A BTREE_SIN
e540: 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73 20  GLE database is 
e550: 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61  always a tempora
e560: 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65  ry and/or epheme
e570: 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ral */.  assert(
e580: 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f   (flags & BTREE_
e590: 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73  SINGLE)==0 || is
e5a0: 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28  TempDb );..  if(
e5b0: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
e5c0: 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d  flags |= BTREE_M
e5d0: 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28  EMORY;.  }.  if(
e5e0: 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c   (vfsFlags & SQL
e5f0: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
e600: 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  )!=0 && (isMemdb
e610: 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b   || isTempDb) ){
e620: 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20  .    vfsFlags = 
e630: 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c  (vfsFlags & ~SQL
e640: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
e650: 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ) | SQLITE_OPEN_
e660: 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70  TEMP_DB;.  }.  p
e670: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
e680: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65  Zero(sizeof(Btre
e690: 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  e));.  if( !p ){
e6a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e6b0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e6c0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
e6d0: 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62  NS_NONE;.  p->db
e6e0: 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53   = db;.#ifndef S
e6f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
e700: 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63  D_CACHE.  p->loc
e710: 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  k.pBtree = p;.  
e720: 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d  p->lock.iTable =
e730: 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   1;.#endif..#if 
e740: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
e750: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
e760: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
e770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
e780: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
e790: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
e7a0: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
e7b0: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
e7c0: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
e7d0: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
e7e0: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
e7f0: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
e800: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
e810: 64 62 3d 3d 30 20 26 26 20 69 73 54 65 6d 70 44  db==0 && isTempD
e820: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
e830: 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
e840: 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
e850: 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
e860: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
e870: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
e880: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
e890: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
e8a0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
e8b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e8c0: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
e8d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
e8e0: 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
e8f0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
e900: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
e910: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
e920: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e930: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
e940: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e950: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
e960: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e970: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e980: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
e990: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
e9a0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e9b0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
e9c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e9d0: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
e9e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
e9f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
ea00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
ea10: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  ;.      }.#if SQ
ea20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
ea30: 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
ea40: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ea50: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ea60: 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
ea70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
ea80: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
ea90: 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
eaa0: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
eab0: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
eac0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
ead0: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
eae0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
eaf0: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
eb00: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
eb10: 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
eb20: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
eb30: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
eb40: 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
eb50: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
eb60: 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
eb70: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
eb80: 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
eb90: 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
eba0: 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
ebb0: 74 2d 3e 70 50 61 67 65 72 29 29 0a 20 20 20 20  t->pPager)).    
ebc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
ebd0: 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
ebe0: 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
ebf0: 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
ec00: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
ec10: 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
ec20: 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
ec30: 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
ec40: 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
ec50: 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
ec60: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
ec70: 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
ec80: 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
ec90: 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
eca0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ecb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
ecc0: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
ecd0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
ece0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
ecf0: 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
ed00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
ed10: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
ed20: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
ed30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ed40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ed50: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ed60: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
ed70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ed80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
ed90: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
eda0: 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
edb0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
edc0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
edd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ede0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
edf0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
ee00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
ee10: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
ee20: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
ee30: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
ee40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
ee50: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
ee60: 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
ee70: 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
ee80: 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
ee90: 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
eea0: 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
eeb0: 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
eec0: 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
eed0: 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
eee0: 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
eef0: 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
ef00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ef10: 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
ef20: 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
ef30: 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
ef40: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
ef50: 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
ef60: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
ef70: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
ef80: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
ef90: 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
efa0: 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
efb0: 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
efc0: 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
efd0: 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
efe0: 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
eff0: 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
f000: 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
f010: 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
f020: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
f030: 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
f040: 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
f050: 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
f060: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f070: 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(i64)==8 || s
f080: 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34 20 29 3b  izeof(i64)==4 );
f090: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f0a0: 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c 7c 20 73  eof(u64)==8 || s
f0b0: 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34 20 29 3b  izeof(u64)==4 );
f0c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
f0d0: 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20  eof(u32)==4 );. 
f0e0: 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
f0f0: 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20  f(u16)==2 );.   
f100: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
f110: 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20  Pgno)==4 );.  . 
f120: 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33     pBt = sqlite3
f130: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65  MallocZero( size
f140: 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20  of(*pBt) );.    
f150: 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
f160: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f170: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
f180: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
f1a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
f1b0: 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50  n(pVfs, &pBt->pP
f1c0: 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  ager, zFilename,
f1d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f1e0: 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41             EXTRA
f1f0: 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66  _SIZE, flags, vf
f200: 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
f210: 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
f220: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f230: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f240: 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
f250: 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
f260: 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
f270: 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
f280: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
f290: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f2a0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
f2b0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
f2c0: 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73    pBt->openFlags
f2d0: 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20   = (u8)flags;.  
f2e0: 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
f2f0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f300: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
f310: 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
f320: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
f330: 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
f340: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
f350: 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
f360: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
f370: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66  age1 = 0;.    if
f380: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
f390: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
f3a0: 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73  ager) ) pBt->bts
f3b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
f3c0: 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53  D_ONLY;.#ifdef S
f3d0: 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
f3e0: 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  ETE.    pBt->bts
f3f0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
f400: 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64  URE_DELETE;.#end
f410: 69 66 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  if.    pBt->page
f420: 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
f430: 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
f440: 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
f450: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
f460: 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
f470: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
f480: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
f490: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
f4a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
f4b0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
f4c0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
f4d0: 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
f4e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f4f0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f500: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
f510: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
f520: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
f530: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
f540: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
f550: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
f560: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
f570: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
f580: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
f590: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
f5a0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
f5b0: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
f5c0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
f5d0: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
f5e0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
f5f0: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
f600: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
f610: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
f620: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
f630: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
f640: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
f650: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
f660: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
f670: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
f680: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
f690: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
f6a0: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f6b0: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
f6c0: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
f6d0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
f6e0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
f6f0: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
f700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
f710: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
f720: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
f730: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
f740: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
f750: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
f760: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
f770: 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
f780: 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
f790: 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
f7a0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
f7b0: 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
f7c0: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
f7d0: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
f7e0: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
f7f0: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
f800: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
f810: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
f820: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
f830: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
f840: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f850: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
f860: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
f870: 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
f880: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
f890: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
f8a0: 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
f8b0: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
f8c0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
f8d0: 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
f8e0: 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
f8f0: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
f900: 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
f910: 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
f920: 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
f930: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
f940: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
f950: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f960: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
f970: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
f980: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
f990: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
f9a0: 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
f9b0: 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
f9c0: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
f9d0: 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
f9e0: 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
f9f0: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
fa00: 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
fa10: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
fa20: 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
fa30: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
fa40: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
fa50: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
fa60: 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
fa70: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
fa80: 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
fa90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
faa0: 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
fab0: 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
fac0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
fad0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
fae0: 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
faf0: 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
fb00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
fb10: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
fb20: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
fb30: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
fb40: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
fb50: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
fb60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fb70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
fb80: 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
fb90: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
fba0: 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
fbb0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fbc0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fbd0: 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
fbe0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
fbf0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
fc00: 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
fc10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fc20: 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
fc30: 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
fc40: 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
fc50: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
fc60: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
fc70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
fc80: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
fc90: 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
fca0: 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
fcb0: 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
fcc0: 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
fcd0: 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
fce0: 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
fcf0: 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
fd00: 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
fd10: 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
fd20: 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
fd30: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
fd40: 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
fd50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
fd60: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
fd70: 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
fd80: 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
fd90: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
fda0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
fdb0: 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
fdc0: 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
fdd0: 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
fde0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
fdf0: 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
fe00: 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
fe10: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
fe20: 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
fe30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
fe40: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
fe50: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
fe60: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
fe70: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
fe80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
fe90: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
fea0: 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
feb0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
fec0: 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
fed0: 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
fee0: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
fef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ff00: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
ff10: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
ff20: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
ff30: 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
ff40: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
ff50: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
ff60: 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
ff70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
ff80: 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
ff90: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
ffa0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ffb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ffc0: 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
ffd0: 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
ffe0: 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
fff0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10000 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
10010 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
10020 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
10030 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
10040 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
10050 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
10060 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
10070 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
10080 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
10090 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
100a0 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
100b0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
100c0 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
100d0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
100e0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
100f0 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
10100 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
10110 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
10120 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
10130 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
10140 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
10150 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
10160 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
10170 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
10180 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
10190 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
101a0 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
101b0 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
101c0 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
101d0 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ZE);.    }.  }. 
101e0 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
101f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
10200 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10210 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
10220 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
10230 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
10240 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10250 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
10260 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
10270 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
10280 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
10290 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
102a0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
102b0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
102c0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
102d0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
102e0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
102f0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
10300 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
10310 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
10320 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
10330 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
10340 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
10350 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
10360 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
10370 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10380 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
10390 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
103a0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
103b0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
103c0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
103d0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
103e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
103f0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
10400 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
10410 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
10420 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
10430 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
10440 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
10450 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
10460 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
10470 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
10480 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
10490 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
104a0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
104b0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
104c0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
104d0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
104e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
104f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10500 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
10510 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10520 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
10530 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10540 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10550 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
10560 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
10570 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
10580 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
10590 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
105a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
105b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
105c0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
105d0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
105e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
105f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
10600 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10610 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10620 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
10630 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
10640 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
10650 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
10660 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
10670 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
10680 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
10690 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
106a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
106b0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
106c0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
106d0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
106e0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
106f0 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
10700 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
10710 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
10720 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
10730 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
10740 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
10750 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
10760 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
10770 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
10780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
10790 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
107a0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
107b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
107c0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
107d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
107e0 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
107f0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
10800 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
10810 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
10820 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
10830 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
10840 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
10850 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10860 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
10870 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
10880 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10890 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
108a0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
108b0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
108c0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
108d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
108e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
108f0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10900 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10910 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
10920 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
10930 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
10940 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
10950 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
10960 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
10970 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
10980 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
10990 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
109a0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
109b0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
109c0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
109d0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
109e0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
109f0 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
10a00 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
10a10 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
10a20 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
10a30 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
10a40 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
10a50 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
10a60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
10a70 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
10a80 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  E_OK);.  sqlite3
10a90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
10aa0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
10ab0 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
10ac0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
10ad0 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
10ae0 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
10af0 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
10b00 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
10b10 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
10b20 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
10b30 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
10b40 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
10b50 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
10b60 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
10b70 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
10b80 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
10b90 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
10ba0 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
10bb0 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
10bc0 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
10bd0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
10be0 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
10bf0 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
10c00 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
10c10 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
10c20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
10c30 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
10c40 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
10c50 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
10c60 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
10c70 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
10c80 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
10c90 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
10ca0 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
10cb0 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
10cc0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42  hema ){.      pB
10cd0 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
10ce0 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
10cf0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
10d00 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53  bFree(0, pBt->pS
10d10 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
10d20 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
10d30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10d40 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
10d50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10d60 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
10d70 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
10d80 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
10d90 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
10da0 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
10db0 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
10dc0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
10dd0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
10de0 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
10df0 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
10e00 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
10e10 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
10e20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10e30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
10e40 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e  e limit on the n
10e50 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 61  umber of pages a
10e60 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61  llowed in the ca
10e70 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  che..**.** The m
10e80 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
10e90 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73 20   cache pages is 
10ea0 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c  set to the absol
10eb0 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  ute.** value of 
10ec0 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61  mxPage.  If mxPa
10ed0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
10ee0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a  the pager will.*
10ef0 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68  * operate asynch
10f00 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69  ronously - it wi
10f10 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64  ll not stop to d
10f20 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f  o fsync()s.** to
10f30 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73 20   insure data is 
10f40 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
10f50 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f  isk surface befo
10f60 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67  re.** continuing
10f70 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20  .  Transactions 
10f80 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79  still work if sy
10f90 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
10fa0 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ,.** and the dat
10fb0 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20  abase cannot be 
10fc0 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68 69  corrupted if thi
10fd0 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61  s program.** cra
10fe0 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74 68  shes.  But if th
10ff0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
11000 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68  em crashes or th
11010 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72  ere is.** an abr
11020 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72  upt power failur
11030 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f  e when synchrono
11040 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64  us is off, the d
11050 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64  atabase.** could
11060 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69   be left in an i
11070 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20  nconsistent and 
11080 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74  unrecoverable st
11090 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e  ate..** Synchron
110a0 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66  ous is on by def
110b0 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65  ault so database
110c0 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e   corruption is n
110d0 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61  ot.** normally a
110e0 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73   worry..*/.int s
110f0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
11100 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
11110 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
11120 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
11130 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
11140 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11150 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
11160 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
11170 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11180 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11190 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
111a0 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
111b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
111c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
111d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
111e0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
111f0 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
11200 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
11210 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
11220 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
11230 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
11240 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
11250 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
11260 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
11270 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
11280 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
11290 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
112a0 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
112b0 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
112c0 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
112d0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
112e0 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
112f0 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
11300 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
11310 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
11320 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
11330 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
11340 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
11350 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
11360 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
11370 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
11380 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
11390 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
113a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
113b0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
113c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
113d0 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20  etSafetyLevel(. 
113e0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
113f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
11400 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
11410 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
11420 2a 2f 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20  */.  int level, 
11430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
11440 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
11450 73 2e 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52  s.  1=OFF, 2=NOR
11460 4d 41 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20  MAL, 3=FULL */. 
11470 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20   int fullSync,  
11480 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d          /* PRAGM
11490 41 20 66 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a  A fullfsync. */.
114a0 20 20 69 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79    int ckptFullSy
114b0 6e 63 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47  nc       /* PRAG
114c0 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75  MA checkpoint_fu
114d0 6c 6c 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42  llfync */.){.  B
114e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
114f0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
11500 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
11510 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11520 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  ) );.  assert( l
11530 65 76 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c  evel>=1 && level
11540 3c 3d 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  <=3 );.  sqlite3
11550 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11560 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11570 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d  SafetyLevel(pBt-
11580 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20  >pPager, level, 
11590 66 75 6c 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75  fullSync, ckptFu
115a0 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
115b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
115c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
115d0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
115e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
115f0 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
11600 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
11610 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
11620 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
11630 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
11640 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
11650 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
11660 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
11670 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
11680 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
11690 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
116a0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
116b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
116c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
116d0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
116e0 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
116f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
11700 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
11710 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
11720 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
11730 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
11740 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
11750 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11760 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11770 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
11780 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
11790 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
117a0 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
117b0 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
117c0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
117d0 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
117e0 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
117f0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
11800 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
11810 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
11820 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
11830 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
11840 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
11850 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
11860 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
11870 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
11880 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
11890 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
118a0 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
118b0 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
118c0 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
118d0 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
118e0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
118f0 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
11900 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
11910 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
11920 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
11930 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
11940 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
11950 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
11960 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
11970 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
11980 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
11990 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
119a0 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
119b0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
119c0 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
119d0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
119e0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
119f0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
11a00 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
11a10 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
11a20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
11a30 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
11a40 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  e BTS_PAGESIZE_F
11a50 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74  IXED flag is set
11a60 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
11a70 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
11a80 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
11a90 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
11aa0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
11ab0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
11ac0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
11ad0 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
11ae0 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
11af0 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
11b00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11b10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11b20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
11b30 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
11b40 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
11b50 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11b60 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
11b70 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
11b80 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
11b90 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  XED ){.    sqlit
11ba0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11bc0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
11bd0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
11be0 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
11bf0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
11c00 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
11c10 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
11c20 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
11c30 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
11c40 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
11c50 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
11c60 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
11c70 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
11c80 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
11c90 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
11ca0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
11cb0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
11cc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
11cd0 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
11ce0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
11cf0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
11d00 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
11d10 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
11d20 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
11d30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11d40 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
11d50 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
11d60 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
11d70 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
11d80 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
11d90 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
11da0 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
11db0 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  Fix ) pBt->btsFl
11dc0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
11dd0 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c  IZE_FIXED;.  sql
11de0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
11df0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11e00 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11e10 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
11e20 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
11e30 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11e40 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
11e50 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
11e60 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
11e70 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  ize;.}..#if !def
11e80 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
11e90 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
11ea0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
11eb0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
11ec0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
11ed0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
11ee0 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
11ef0 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
11f00 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
11f10 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
11f20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
11f30 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
11f40 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
11f50 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
11f60 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
11f70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11f80 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72  eeGetReserve(Btr
11f90 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
11fa0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
11fb0 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70  nter(p);.  n = p
11fc0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
11fd0 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
11fe0 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  Size;.  sqlite3B
11ff0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12000 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
12010 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  ** Set the maxim
12020 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f  um page count fo
12030 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20  r a database if 
12040 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
12050 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65  ve..** No change
12060 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78  s are made if mx
12070 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67  Page is 0 or neg
12080 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64  ative..** Regard
12090 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
120a0 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  e of mxPage, ret
120b0 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
120c0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
120d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
120e0 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65  axPageCount(Btre
120f0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
12100 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
12110 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12120 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
12130 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
12140 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  nt(p->pBt->pPage
12150 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
12160 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12170 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
12180 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
12190 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
121a0 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c  TE flag if newFl
121b0 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49  ag is 0 or 1.  I
121c0 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c  f newFlag is -1,
121d0 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f  .** then make no
121e0 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79   changes.  Alway
121f0 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c  s return the val
12200 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45  ue of the BTS_SE
12210 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73  CURE_DELETE.** s
12220 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65  etting after the
12230 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20   change..*/.int 
12240 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75  sqlite3BtreeSecu
12250 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a  reDelete(Btree *
12260 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b  p, int newFlag){
12270 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20  .  int b;.  if( 
12280 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
12290 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
122a0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e  nter(p);.  if( n
122b0 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20  ewFlag>=0 ){.   
122c0 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
122d0 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45  s &= ~BTS_SECURE
122e0 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28  _DELETE;.    if(
122f0 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42   newFlag ) p->pB
12300 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
12310 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
12320 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d  ;.  } .  b = (p-
12330 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
12340 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
12350 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65  TE)!=0;.  sqlite
12360 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12370 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65    return b;.}.#e
12380 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
12390 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
123a0 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
123b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
123c0 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
123d0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
123e0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
123f0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
12400 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
12410 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
12420 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
12430 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
12440 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
12450 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
12460 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
12470 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
12480 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
12490 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
124a0 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
124b0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
124c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
124d0 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
124e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
124f0 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
12500 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
12510 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
12520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12530 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
12540 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
12550 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
12560 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
12570 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12580 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
12590 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
125a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
125b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
125c0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
125d0 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
125e0 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
125f0 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
12600 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
12610 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
12620 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
12630 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
12640 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
12650 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
12660 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
12670 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
12680 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12690 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
126a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
126b0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
126c0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
126d0 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
126e0 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
126f0 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
12700 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
12710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12720 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
12730 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
12740 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12750 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
12760 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
12770 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
12780 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
12790 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
127a0 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
127b0 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
127c0 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
127d0 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
127e0 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
127f0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
12800 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
12810 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
12820 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
12830 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12840 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12850 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
12860 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
12870 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
12880 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
12890 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
128a0 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
128b0 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
128c0 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
128d0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
128e0 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
128f0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
12900 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
12910 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
12920 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
12930 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
12940 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
12950 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
12960 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
12970 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
12980 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
12990 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
129a0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
129b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
129c0 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
129d0 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
129e0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
129f0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
12a00 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
12a10 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
12a20 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
12a30 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
12a40 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
12a50 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
12a60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
12a70 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
12a80 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
12a90 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
12aa0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
12ab0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
12ac0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
12ad0 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
12ae0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12af0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
12b00 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
12b10 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
12b20 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12b30 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
12b40 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12b50 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
12b60 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12b70 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
12b80 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
12b90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12ba0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
12bb0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
12bc0 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
12bd0 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
12be0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
12bf0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
12c00 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
12c10 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
12c20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
12c30 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
12c40 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
12c50 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
12c60 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
12c70 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
12c80 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
12c90 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
12ca0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
12cb0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
12cc0 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
12cd0 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
12ce0 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
12cf0 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
12d00 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
12d10 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
12d20 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
12d30 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
12d40 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
12d50 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
12d60 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
12d70 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
12d80 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
12d90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
12da0 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
12db0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
12dc0 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
12dd0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
12de0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
12df0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
12e00 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
12e10 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
12e20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
12e30 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
12e40 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
12e50 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
12e60 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
12e70 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
12e80 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
12e90 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
12ea0 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
12eb0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
12ec0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
12ed0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
12ee0 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
12ef0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
12f00 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
12f10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
12f20 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
12f30 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
12f40 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
12f50 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
12f60 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
12f70 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
12f80 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
12f90 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
12fa0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
12fb0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
12fc0 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
12fd0 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
12fe0 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
12ff0 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
13000 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
13010 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
13020 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
13030 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
13040 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
13050 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
13060 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
13070 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
13080 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
13090 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
130a0 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
130b0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
130c0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
130d0 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
130e0 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
130f0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
13100 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
13110 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
13120 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
13130 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
13140 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
13150 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
13160 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13170 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
13180 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13190 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
131a0 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29   if( isOpen==0 )
131b0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
131c0 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45  DEFAULT_WAL_SAFE
131d0 54 59 4c 45 56 45 4c 0a 20 20 20 20 20 20 20 20  TYLEVEL.        
131e0 2f 2a 20 44 65 66 61 75 6c 74 20 74 6f 20 73 70  /* Default to sp
131f0 65 63 69 66 69 65 64 20 73 61 66 65 74 79 5f 6c  ecified safety_l
13200 65 76 65 6c 20 66 6f 72 20 57 41 4c 20 6d 6f 64  evel for WAL mod
13210 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  e */.        if(
13220 20 70 42 74 2d 3e 64 62 21 3d 30 20 26 26 20 70   pBt->db!=0 && p
13230 42 74 2d 3e 64 62 2d 3e 61 44 62 21 3d 30 20 29  Bt->db->aDb!=0 )
13240 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
13250 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73  iDb;.          s
13260 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74  qlite3 *db = pBt
13270 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
13280 44 62 20 2a 61 44 62 20 3d 20 64 62 2d 3e 61 44  Db *aDb = db->aD
13290 62 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  b;.          u8 
132a0 6c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20  level = 0;.     
132b0 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20       for(iDb=0; 
132c0 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
132d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
132e0 20 69 66 28 20 61 44 62 5b 69 44 62 5d 2e 70 42   if( aDb[iDb].pB
132f0 74 20 26 26 20 61 44 62 5b 69 44 62 5d 2e 70 42  t && aDb[iDb].pB
13300 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 20 62 72  t->pBt==pBt ) br
13310 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
13320 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
13330 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
13340 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 76 65  ;.          leve
13350 6c 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  l = db->aDb[iDb]
13360 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20  .safety_level;. 
13370 20 20 20 20 20 20 20 20 20 69 66 28 20 21 53 51           if( !SQ
13380 4c 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76  LITE_DbSafetyLev
13390 65 6c 49 73 46 69 78 65 64 28 6c 65 76 65 6c 29  elIsFixed(level)
133a0 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20   && .           
133b0 20 20 28 53 51 4c 49 54 45 5f 44 62 53 61 66 65    (SQLITE_DbSafe
133c0 74 79 4c 65 76 65 6c 56 61 6c 75 65 28 6c 65 76  tyLevelValue(lev
133d0 65 6c 29 20 21 3d 20 53 51 4c 49 54 45 5f 44 45  el) != SQLITE_DE
133e0 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59  FAULT_WAL_SAFETY
133f0 4c 45 56 45 4c 29 20 29 7b 0a 20 20 20 20 20 20  LEVEL) ){.      
13400 20 20 20 20 20 20 61 44 62 5b 69 44 62 5d 2e 73        aDb[iDb].s
13410 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51  afety_level = SQ
13420 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
13430 5f 53 41 46 45 54 59 4c 45 56 45 4c 3b 0a 20 20  _SAFETYLEVEL;.  
13440 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13450 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
13460 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
13470 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
13480 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c  _WAL_SAFETYLEVEL
13490 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
134a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134b0 20 20 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66            (db->f
134c0 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 75 6c 6c  lags&SQLITE_Full
134d0 46 53 79 6e 63 29 21 3d 30 2c 0a 20 20 20 20 20  FSync)!=0,.     
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13500 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c    (db->flags&SQL
13510 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e  ITE_CkptFullFSyn
13520 63 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  c)!=0);.        
13530 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
13540 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 65 6c  ndif.        rel
13550 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
13560 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13580 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53    }.      rc = S
13590 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  QLITE_NOTADB;.  
135a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
135b0 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
135c0 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
135d0 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
135e0 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
135f0 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
13600 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
13610 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
13620 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
13630 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
13640 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
13650 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
13660 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
13670 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
13680 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
13690 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
136a0 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
136b0 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
136c0 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
136d0 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
136e0 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
136f0 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
13700 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13710 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
13720 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31  eSize = (page1[1
13730 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b  6]<<8) | (page1[
13740 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66  17]<<16);.    if
13750 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26  ( ((pageSize-1)&
13760 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20  pageSize)!=0.   
13770 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51    || pageSize>SQ
13780 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
13790 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  ZE .     || page
137a0 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29  Size<=256 .    )
137b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
137c0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
137d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
137e0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
137f0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
13800 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
13810 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
13820 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65 53    if( (u32)pageS
13830 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize!=pBt->pageSi
13840 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ze ){.      /* A
13850 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68 65  fter reading the
13860 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
13870 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 75  he database assu
13880 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65  ming a page size
13890 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53  .      ** of BtS
138a0 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20  hared.pageSize, 
138b0 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65 72  we have discover
138c0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
138d0 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a  -size is.      *
138e0 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53  * actually pageS
138f0 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20  ize. Unlock the 
13900 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20  database, leave 
13910 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20  pBt->pPage1 at. 
13920 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64       ** zero and
13930 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13940 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  K. The caller wi
13950 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e  ll call this fun
13960 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61  ction.      ** a
13970 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f  gain with the co
13980 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e  rrect page-size.
13990 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
139a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
139b0 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
139c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
139d0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
139e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
139f0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
13a00 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
13a10 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
13a20 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
13a30 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
13a40 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
13a50 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
13a80 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
13a90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13aa0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d   }.    if( (pBt-
13ab0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
13ac0 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65  ITE_RecoveryMode
13ad0 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50  )==0 && nPage>nP
13ae0 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  ageFile ){.     
13af0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
13b00 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
13b10 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
13b20 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
13b30 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
13b40 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
13b50 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
13b60 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
13b70 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
13b80 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
13b90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
13ba0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
13bb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13bc0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
13bd0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
13be0 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
13bf0 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
13c00 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
13c10 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
13c20 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
13c30 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
13c40 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
13c50 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
13c60 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
13c70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
13c80 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
13c90 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
13ca0 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
13cb0 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
13cc0 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
13cd0 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
13ce0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
13cf0 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
13d00 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
13d10 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
13d20 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
13d30 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
13d40 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
13d50 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
13d60 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
13d70 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
13d80 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
13d90 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
13da0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
13db0 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
13dc0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
13dd0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
13de0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
13df0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
13e00 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
13e10 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
13e20 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
13e30 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
13e40 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
13e50 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
13e60 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
13e70 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
13e80 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
13e90 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
13ea0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
13eb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
13ec0 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
13ed0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
13ee0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
13ef0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
13f00 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
13f10 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
13f20 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
13f30 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
13f40 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
13f50 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
13f60 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
13f70 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  3);.  if( pBt->m
13f80 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20  axLocal>127 ){. 
13f90 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
13fa0 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20  Payload = 127;. 
13fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
13fc0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
13fd0 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c   = (u8)pBt->maxL
13fe0 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ocal;.  }.  asse
13ff0 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
14000 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
14010 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
14020 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
14030 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61  age1;.  pBt->nPa
14040 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
14050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14060 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
14070 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
14080 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
14090 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
140a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
140b0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
140c0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
140d0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
140e0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
140f0 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
14100 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
14110 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
14120 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14130 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
14140 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
14150 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
14160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14170 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
14180 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
14190 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
141a0 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
141b0 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
141c0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
141d0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
141e0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
141f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
14200 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
14210 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14220 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14230 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
14240 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
14250 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
14260 73 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  sor==0 || pBt->i
14270 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
14280 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
14290 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
142a0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
142b0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
142c0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
142d0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
142e0 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
142f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
14300 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
14310 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  ger)==1 );.    a
14320 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
14330 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
14340 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
14350 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70  ->pPage1);.    p
14360 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
14370 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
14380 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
14390 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
143a0 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
143b0 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
143c0 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
143d0 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
143e0 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
143f0 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
14400 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
14410 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
14420 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
14430 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
14440 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
14450 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
14460 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
14470 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14480 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
14490 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
144a0 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
144b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
144c0 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
144d0 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
144e0 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
144f0 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
14500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
14510 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
14520 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
14530 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
14540 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
14550 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
14560 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
14570 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
14580 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
14590 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
145a0 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
145b0 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
145c0 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
145d0 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
145e0 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
145f0 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
14600 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
14610 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
14620 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
14630 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
14640 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
14650 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
14660 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
14670 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
14680 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
14690 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
146a0 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
146b0 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
146c0 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
146d0 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
146e0 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
146f0 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
14700 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
14710 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
14720 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14730 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
14740 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
14750 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
14760 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
14770 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
14780 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
14790 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
147a0 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
147b0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
147c0 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
147d0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
147e0 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
147f0 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
14800 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
14810 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
14820 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
14830 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
14840 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
14850 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
14860 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14870 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
14880 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
14890 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
148a0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
148b0 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
148c0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
148d0 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
148e0 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
148f0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
14900 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
14910 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
14920 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
14930 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
14940 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
14950 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
14960 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
14970 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
14980 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
14990 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
149a0 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
149b0 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
149c0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
149d0 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
149e0 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
149f0 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
14a00 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
14a10 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
14a20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
14a30 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
14a40 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
14a50 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
14a60 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
14a70 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
14a80 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
14a90 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
14aa0 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
14ab0 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
14ac0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
14ad0 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
14ae0 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
14af0 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
14b00 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
14b10 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
14b20 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
14b30 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
14b40 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
14b50 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
14b60 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
14b70 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
14b80 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
14b90 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
14ba0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
14bb0 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
14bc0 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
14bd0 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
14be0 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
14bf0 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
14c00 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
14c10 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
14c20 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
14c30 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
14c40 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
14c50 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
14c60 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
14c70 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
14c80 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
14c90 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
14ca0 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
14cb0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
14cc0 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
14cd0 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
14ce0 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
14cf0 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
14d00 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
14d10 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
14d20 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
14d30 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
14d40 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
14d50 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
14d60 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
14d70 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
14d80 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
14d90 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
14da0 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
14db0 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
14dc0 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
14dd0 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
14de0 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
14df0 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
14e00 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
14e10 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
14e20 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
14e30 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
14e40 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
14e50 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
14e60 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
14e70 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
14e80 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
14e90 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
14ea0 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
14eb0 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
14ec0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
14ed0 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
14ee0 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
14ef0 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
14f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
14f10 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
14f20 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
14f30 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
14f40 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
14f50 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14f60 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
14f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
14f80 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
14f90 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
14fa0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
14fb0 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
14fc0 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
14fd0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
14fe0 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
14ff0 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
15000 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
15010 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
15020 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
15030 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
15040 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
15050 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
15060 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
15070 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
15080 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
15090 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
150a0 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20  s_begun;.  }..  
150b0 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
150c0 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
150d0 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
150e0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
150f0 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74  /.  if( (pBt->bt
15100 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
15110 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72  D_ONLY)!=0 && wr
15120 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
15130 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
15140 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
15150 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
15160 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15170 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
15180 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
15190 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
151a0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
151b0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
151c0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
151d0 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
151e0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
151f0 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
15200 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
15210 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
15220 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
15230 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
15240 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
15250 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
15260 53 5f 57 52 49 54 45 29 0a 20 20 20 7c 7c 20 28  S_WRITE).   || (
15270 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
15280 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a  BTS_PENDING)!=0.
15290 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20    ){.    pBlock 
152a0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
152b0 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
152c0 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
152d0 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
152e0 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
152f0 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
15300 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
15310 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
15320 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
15330 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
15340 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
15350 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
15360 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15370 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
15380 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
15390 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
153a0 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
153b0 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
153c0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
153d0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
153e0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
153f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15400 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
15410 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
15420 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
15430 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
15440 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
15450 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
15460 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
15470 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
15480 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
15490 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
154a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
154b0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
154c0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
154d0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
154e0 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
154f0 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
15500 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
15510 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
15520 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
15530 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
15540 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
15550 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
15560 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
15570 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
15580 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
15590 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
155a0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
155b0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
155c0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
155d0 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
155e0 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
155f0 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
15600 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
15610 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
15620 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
15630 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
15640 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
15650 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
15660 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
15670 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
15680 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
15690 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
156a0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
156b0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
156c0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
156d0 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
156e0 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
156f0 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
15700 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
15710 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
15720 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
15730 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
15740 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
15750 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
15760 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
15770 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15780 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
15790 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
157a0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
157b0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
157c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
157d0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
157e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
157f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
15800 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
15810 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
15820 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
15830 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
15840 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
15850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15860 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
15870 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
15880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15890 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
158a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
158b0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
158c0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
158d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
158e0 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
158f0 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
15900 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
15910 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
15920 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
15930 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
15940 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
15950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15960 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
15970 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
15980 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
15990 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
159a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
159b0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
159c0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
159d0 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70  le ){..assert( p
159e0 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70  ->lock.pBtree==p
159f0 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62   && p->lock.iTab
15a00 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
15a10 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d   p->lock.eLock =
15a20 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
15a30 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78      p->lock.pNex
15a40 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a  t = pBt->pLock;.
15a50 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f          pBt->pLo
15a60 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20  ck = &p->lock;. 
15a70 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
15a80 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61    }.    p->inTra
15a90 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41  ns = (wrflag?TRA
15aa0 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52  NS_WRITE:TRANS_R
15ab0 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  EAD);.    if( p-
15ac0 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e  >inTrans>pBt->in
15ad0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
15ae0 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
15af0 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54  saction = p->inT
15b00 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rans;.    }.    
15b10 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
15b20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
15b30 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
15b40 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
15b50 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15b60 43 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74  CHE.      assert
15b70 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20  ( !pBt->pWriter 
15b80 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57  );.      pBt->pW
15b90 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20  riter = p;.     
15ba0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
15bb0 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45  = ~BTS_EXCLUSIVE
15bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c  ;.      if( wrfl
15bd0 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46  ag>1 ) pBt->btsF
15be0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c  lags |= BTS_EXCL
15bf0 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  USIVE;.#endif.. 
15c00 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
15c10 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69  b-size header fi
15c20 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74  eld is incorrect
15c30 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
15c40 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a  f an old.      *
15c50 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65  * client has bee
15c60 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  n writing the da
15c70 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70  tabase file), up
15c80 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69  date it now. Doi
15c90 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  ng.      ** this
15ca0 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
15cb0 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20  han later means 
15cc0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
15cd0 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20  e can safely .  
15ce0 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74      ** re-read t
15cf0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
15d00 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20   from page 1 if 
15d10 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74  a savepoint or t
15d20 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20  ransaction.     
15d30 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63   ** rollback occ
15d40 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  urs within the t
15d50 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
15d60 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
15d70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62  Bt->nPage!=get4b
15d80 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
15d90 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20  ta[28]) ){.     
15da0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15db0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
15dc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
15dd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15de0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15df0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
15e00 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
15e10 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
15e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15e30 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73     }.  }...trans
15e40 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
15e50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
15e60 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
15e70 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
15e80 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
15e90 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
15ea0 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
15eb0 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
15ec0 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
15ed0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
15ee0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
15ef0 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
15f00 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
15f10 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
15f20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
15f30 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
15f40 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
15f50 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
15f60 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
15f70 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
15f80 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
15f90 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
15fa0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15fb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15fc0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
15fd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15fe0 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
15ff0 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
16000 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
16010 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
16020 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
16030 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
16040 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
16050 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
16060 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
16070 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
16080 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
16090 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
160a0 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
160b0 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
160c0 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
160d0 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
160e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16100 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
16110 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
16120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16140 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
16150 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
16160 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16190 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
161a0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
161b0 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
161c0 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
161d0 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
161e0 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
161f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16200 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
16210 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
16220 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49  );.  rc = btreeI
16230 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
16240 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16250 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
16260 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
16270 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65  s_out;.  }.  nCe
16280 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
16290 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l;..  for(i=0; i
162a0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
162b0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
162c0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
162d0 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ;..    ptrmapPut
162e0 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
162f0 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
16300 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
16310 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
16320 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
16330 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
16340 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
16350 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
16360 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
16370 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
16380 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
16390 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
163a0 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
163b0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
163c0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
163d0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
163e0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
163f0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
16400 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
16410 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64  ;.  }..set_child
16420 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20  _ptrmaps_out:.  
16430 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
16440 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65  isInitOrig;.  re
16450 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16460 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70  * Somewhere on p
16470 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65  Page is a pointe
16480 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
16490 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f    Modify this po
164a0 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74  inter so.** that
164b0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54   it points to iT
164c0 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79  o. Parameter eTy
164d0 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  pe describes the
164e0 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72   type of pointer
164f0 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69   to.** be modifi
16500 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a  ed, as  follows:
16510 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54  .**.** PTRMAP_BT
16520 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69  REE:     pPage i
16530 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
16540 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
16550 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a  ts at a child .*
16560 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16570 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67      page of pPag
16580 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
16590 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65  OVERFLOW1: pPage
165a0 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
165b0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
165c0 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66  ints at an overf
165d0 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  low.**          
165e0 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f           page po
165f0 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20  inted to by one 
16600 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20  of the cells on 
16610 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52  pPage..**.** PTR
16620 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70  MAP_OVERFLOW2: p
16630 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
16640 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  low-page. The po
16650 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
16660 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20  the next.**     
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76                ov
16680 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
16690 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  he list..*/.stat
166a0 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67  ic int modifyPag
166b0 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65  ePointer(MemPage
166c0 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46   *pPage, Pgno iF
166d0 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75  rom, Pgno iTo, u
166e0 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65  8 eType){.  asse
166f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16700 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
16710 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
16720 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
16730 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
16740 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
16750 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  ;.  if( eType==P
16760 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
16770 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ){.    /* The po
16780 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20  inter is always 
16790 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
167a0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
167b0 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
167c0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
167d0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d  (pPage->aData)!=
167e0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72  iFrom ){.      r
167f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
16800 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
16810 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
16820 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
16830 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75  ;.  }else{.    u
16840 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
16850 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
16860 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
16870 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72   nCell;..    btr
16880 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
16890 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
168a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
168b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
168c0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
168d0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
168e0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
168f0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
16900 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
16910 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
16920 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
16930 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
16940 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
16950 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
16960 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
16970 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20  erflow.         
16980 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f  && pCell+info.iO
16990 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65  verflow+3<=pPage
169a0 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d  ->aData+pPage->m
169b0 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20  askPage.        
169c0 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62   && iFrom==get4b
169d0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
169e0 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20  iOverflow]).    
169f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
16a00 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
16a10 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
16a20 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
16a30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
16a40 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
16a50 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34          if( get4
16a60 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72  byte(pCell)==iFr
16a70 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  om ){.          
16a80 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
16a90 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
16aa0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
16ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16ac0 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65   .    if( i==nCe
16ad0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
16ae0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54  eType!=PTRMAP_BT
16af0 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  REE || .        
16b00 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67    get4byte(&pPag
16b10 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
16b20 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69  hdrOffset+8])!=i
16b30 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
16b40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
16b50 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
16b60 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
16b70 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
16b80 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
16b90 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  t+8], iTo);.    
16ba0 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  }..    pPage->is
16bb0 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
16bc0 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
16bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
16be0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70  *.** Move the op
16bf0 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  en database page
16c00 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61   pDbPage to loca
16c10 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69  tion iFreePage i
16c20 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  n the .** databa
16c30 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20  se. The pDbPage 
16c40 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e  reference remain
16c50 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54  s valid..**.** T
16c60 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67  he isCommit flag
16c70 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
16c80 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
16c90 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
16ca0 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t.** the journal
16cb0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
16cc0 63 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74  c()ed before dat
16cd0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
16ce0 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e  ge->pgno .** can
16cf0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
16d00 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
16d10 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
16d20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
16d30 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f  that.** page..*/
16d40 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
16d50 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
16d60 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
16d70 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
16d80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
16d90 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
16da0 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
16db0 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16dd0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
16de0 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
16df0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
16e00 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
16e10 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16e20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
16e30 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
16e40 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
16e50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
16e60 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
16e70 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
16e80 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
16e90 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  it             /
16ea0 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  * isCommit flag 
16eb0 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65  passed to sqlite
16ec0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a  3PagerMovepage *
16ed0 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
16ee0 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
16ef0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
16f00 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
16f10 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
16f20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
16f30 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
16f40 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
16f50 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
16f60 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
16f70 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
16f80 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
16f90 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
16fa0 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
16fb0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
16fc0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
16fd0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
16fe0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16ff0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
17000 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
17010 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
17020 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
17030 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
17040 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
17050 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
17060 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
17070 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
17080 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
17090 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
170a0 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
170b0 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
170c0 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
170d0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
170e0 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
170f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17100 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
17110 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
17120 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
17130 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
17140 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17150 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
17160 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
17170 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
17180 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
17190 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
171a0 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
171b0 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
171c0 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
171d0 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
171e0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
171f0 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
17200 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
17210 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
17220 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
17230 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
17240 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
17250 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
17260 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
17270 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
17280 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
17290 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
172a0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
172b0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
172c0 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
172d0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
172e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
172f0 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
17300 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
17310 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
17320 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
17330 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
17340 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
17350 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
17360 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
17370 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
17380 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17390 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
173a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
173b0 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
173c0 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
173d0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
173e0 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
173f0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
17400 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
17410 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
17420 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
17430 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
17440 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17450 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
17460 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
17470 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
17480 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
17490 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
174a0 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
174b0 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
174c0 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
174d0 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
174e0 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
174f0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
17500 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
17510 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
17520 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
17530 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
17540 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
17550 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
17560 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
17570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
17590 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
175a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
175b0 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
175c0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
175d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
175e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
175f0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
17600 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17610 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
17620 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
17630 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
17640 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
17650 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
17660 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
17670 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
17680 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17690 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
176a0 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
176b0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
176c0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
176d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
176e0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
176f0 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
17700 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
17710 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
17720 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
17730 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
17740 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
17750 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
17760 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
17770 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
17780 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
17790 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
177a0 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
177b0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
177c0 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
177d0 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
177e0 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20  ore no.** point 
177f0 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  in calling this 
17800 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
17810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
17820 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ONE..**.** More 
17830 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73  specificly, this
17840 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
17850 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
17860 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  e the .** databa
17870 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c  se so that the l
17880 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
17890 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
178a0 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c  n use.** is no l
178b0 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
178c0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20  .** If the nFin 
178d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
178e0 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63  -zero, this func
178f0 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20  tion assumes.** 
17900 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
17910 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
17920 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
17930 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72  () until.** it r
17940 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
17950 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20  NE or an error, 
17960 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73  and that nFin is
17970 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
17980 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61  f pages the data
17990 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63  base file will c
179a0 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69  ontain after thi
179b0 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  s .** process is
179c0 20 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e   complete.  If n
179d0 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20  Fin is zero, it 
179e0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
179f0 2a 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ** incrVacuumSte
17a00 70 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  p() will be call
17a10 65 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75  ed a finite amou
17a20 6e 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77  nt of times.** w
17a30 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20  hich may or may 
17a40 6e 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66 72  not empty the fr
17a50 65 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20  eelist.  A full 
17a60 61 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61  autovacuum.** ha
17a70 73 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52  s nFin>0.  A "PR
17a80 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c  AGMA incremental
17a90 5f 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69  _vacuum" has nFi
17aa0 6e 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  n==0..*/.static 
17ab0 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74  int incrVacuumSt
17ac0 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ep(BtShared *pBt
17ad0 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e  , Pgno nFin, Pgn
17ae0 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67  o iLastPg){.  Pg
17af0 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20  no nFreeList;   
17b00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17b10 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c  r of pages still
17b20 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
17b30 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t */.  int rc;..
17b40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17b50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
17b60 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
17b70 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46  sert( iLastPg>nF
17b80 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54  in );..  if( !PT
17b90 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
17ba0 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
17bb0 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
17bc0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
17bd0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
17be0 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
17bf0 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
17c00 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
17c10 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
17c20 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
17c30 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
17c40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17c50 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
17c60 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
17c70 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
17c80 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
17c90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
17ca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17cb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17cc0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
17cd0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
17ce0 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
17cf0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
17d00 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
17d10 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
17d20 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
17d30 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d        if( nFin==
17d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
17d50 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
17d60 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
17d70 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
17d80 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
17d90 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69         ** if nFi
17da0 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  n is non-zero. I
17db0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
17dc0 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
17dd0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
17de0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
17df0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
17e00 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
17e10 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
17e20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
17e30 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
17e40 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
17e50 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
17e60 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
17e70 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
17e80 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
17e90 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
17ea0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
17eb0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
17ec0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
17ed0 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tPg, 1);.       
17ee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17ef0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
17f00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17f10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
17f20 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
17f30 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
17f40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
17f50 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
17f60 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
17f70 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
17f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17f90 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
17fa0 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
17fb0 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
17fc0 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
17fd0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
17fe0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
17ff0 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
18000 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
18010 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18020 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18030 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
18040 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20    /* If nFin is 
18050 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
18060 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
18070 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
18080 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
18090 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
180a0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
180b0 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
180c0 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
180d0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
180e0 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
180f0 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65  f nFin is greate
18100 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
18110 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
18120 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
18130 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
18140 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
18150 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
18160 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
18170 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
18180 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b     */.      do {
18190 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
181a0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
181b0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
181c0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
181d0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
181e0 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
181f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18200 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
18210 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
18220 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
18230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
18240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
18250 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
18260 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
18270 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72  ( nFin!=0 && iFr
18280 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
18290 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
182a0 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
182b0 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
182c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
182d0 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61  e(pLastPg->pDbPa
182e0 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
182f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18300 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c          rc = rel
18310 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
18320 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
18330 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
18340 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20  , nFin!=0);.    
18350 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
18360 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
18370 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18380 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18390 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
183a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
183b0 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29  .  if( nFin==0 )
183c0 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b  {.    iLastPg--;
183d0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73  .    while( iLas
183e0 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg==PENDING_BYT
183f0 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52  E_PAGE(pBt)||PTR
18400 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
18410 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20  iLastPg) ){.    
18420 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
18430 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
18440 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ) ){.        Mem
18450 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20  Page *pPg;.     
18460 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
18470 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50  Page(pBt, iLastP
18480 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  g, &pPg, 0);.   
18490 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
184a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
184b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
184c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
184d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
184e0 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
184f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
18500 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
18510 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
18520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18530 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18540 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
18550 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74     }.      iLast
18560 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Pg--;.    }.    
18570 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
18580 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
18590 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b  Pager, iLastPg);
185a0 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
185b0 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
185c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
185d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
185e0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
185f0 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
18600 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
18610 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
18620 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
18630 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
18640 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
18650 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
18660 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
18670 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
18680 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
18690 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
186a0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
186b0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
186c0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
186d0 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
186e0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
186f0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
18700 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
18710 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
18720 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
18730 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18740 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
18750 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
18760 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
18770 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
18780 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18790 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
187a0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
187b0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
187c0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
187d0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
187e0 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
187f0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
18800 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
18810 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
18820 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
18830 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
18840 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
18850 65 70 28 70 42 74 2c 20 30 2c 20 62 74 72 65 65  ep(pBt, 0, btree
18860 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b  Pagecount(pBt));
18870 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18890 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
188a0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
188b0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
188c0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
188d0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
188e0 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
188f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
18900 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18910 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
18920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
18930 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
18940 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
18950 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
18960 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
18970 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
18980 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
18990 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
189a0 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
189b0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
189c0 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
189d0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
189e0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
189f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
18a00 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
18a10 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
18a20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
18a30 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
18a40 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
18a50 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
18a60 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
18a70 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
18a80 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
18a90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
18aa0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
18ab0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
18ac0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18ad0 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
18ae0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
18af0 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
18b00 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
18b10 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
18b20 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
18b30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
18b40 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
18b50 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
18b60 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
18b70 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
18b80 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
18b90 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
18ba0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
18bb0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
18bc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18bd0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
18be0 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
18bf0 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
18c00 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
18c10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18c20 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
18c30 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
18c40 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74   */.    Pgno nPt
18c50 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75  rmap;      /* Nu
18c60 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
18c70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
18c80 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
18c90 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
18ca0 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
18cb0 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 69  e freed */.    i
18cc0 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
18cd0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
18ce0 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
18cf0 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20  rmap page */.   
18d00 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
18d10 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
18d20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65  size before free
18d30 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69  ing */..    nOri
18d40 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
18d50 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  nt(pBt);.    if(
18d60 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
18d70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
18d80 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
18d90 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
18da0 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
18db0 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
18dc0 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
18dd0 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
18de0 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
18df0 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
18e00 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
18e10 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
18e20 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
18e30 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
18e40 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
18e50 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
18e60 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
18e70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18e80 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
18e90 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
18ea0 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
18eb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
18ec0 36 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20  6]);.    nEntry 
18ed0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
18ee0 65 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70  e/5;.    nPtrmap
18ef0 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
18f00 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
18f10 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
18f20 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46  )/nEntry;.    nF
18f30 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
18f40 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
18f50 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
18f60 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
18f70 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
18f80 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18f90 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d  ) ){.      nFin-
18fa0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  -;.    }.    whi
18fb0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
18fc0 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
18fd0 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
18fe0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
18ff0 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
19000 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e    }.    if( nFin
19010 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
19020 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19030 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46  KPT;..    for(iF
19040 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
19050 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
19060 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
19070 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
19080 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
19090 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20   nFin, iFree);. 
190a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
190b0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
190c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
190d0 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
190e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
190f0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
19100 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
19110 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
19120 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
19130 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
19140 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
19150 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
19160 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
19170 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
19180 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
19190 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 73  , nFin);.      s
191a0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
191b0 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
191c0 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  ager, nFin);.   
191d0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
191e0 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
191f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19200 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
19210 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
19220 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
19230 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
19240 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef==sqlite3Pager
19250 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
19260 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
19270 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
19280 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
19290 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
192a0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
192b0 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
192c0 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
192d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
192e0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
192f0 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
19300 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
19310 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
19320 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
19330 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
19340 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
19350 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
19360 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
19370 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
19380 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
19390 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
193a0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
193b0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
193c0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
193d0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
193e0 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
193f0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
19400 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
19410 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
19420 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
19430 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
19440 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
19450 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
19460 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
19470 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
19480 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
19490 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
194a0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
194b0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
194c0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
194d0 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
194e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
194f0 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
19500 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
19510 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
19520 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
19530 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
19540 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
19550 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
19560 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
19570 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
19580 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
19590 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
195a0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
195b0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
195c0 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
195d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
195e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
195f0 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
19600 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
19610 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
19620 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
19630 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
19640 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
19650 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
19660 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
19670 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
19680 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
19690 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
196a0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
196b0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
196c0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
196d0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
196e0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
196f0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
19700 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
19710 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
19720 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
19730 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
19740 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
19750 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
19760 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
19770 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
19780 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
19790 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
197a0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
197b0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
197c0 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
197d0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
197e0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
197f0 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
19800 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
19810 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
19820 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
19830 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
19840 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
19850 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
19860 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
19870 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
19880 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19890 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
198a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
198b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
198c0 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
198d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
198e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
198f0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
19900 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
19910 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
19920 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
19930 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19940 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19950 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
19960 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
19970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19980 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20  #endif.    rc = 
19990 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
199a0 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e  itPhaseOne(pBt->
199b0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c  pPager, zMaster,
199c0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
199d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
199e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
199f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
19a00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
19a10 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65   from both Btree
19a20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
19a30 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61   and BtreeRollba
19a40 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63  ck().** at the c
19a50 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74  onclusion of a t
19a60 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
19a70 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
19a80 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42  EndTransaction(B
19a90 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
19aa0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
19ab0 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
19ac0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
19ad0 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 62 74  utex(p) );..  bt
19ae0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
19af0 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70  nt(pBt);.  if( p
19b00 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
19b10 4e 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e 61  NONE && p->db->a
19b20 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29  ctiveVdbeCnt>1 )
19b30 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
19b40 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
19b50 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
19b60 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
19b70 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
19b80 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
19b90 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
19ba0 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
19bb0 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
19bc0 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
19bd0 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
19be0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
19bf0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
19c00 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
19c10 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
19c20 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
19c30 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
19c40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
19c50 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
19c60 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
19c70 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
19c80 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
19c90 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
19ca0 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
19cb0 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
19cc0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19cd0 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
19ce0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
19cf0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
19d00 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
19d10 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
19d20 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
19d30 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
19d40 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
19d50 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
19d60 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
19d70 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
19d80 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
19d90 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
19da0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
19db0 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
19dc0 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
19dd0 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
19de0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
19df0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
19e00 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
19e10 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
19e20 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
19e30 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
19e40 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
19e50 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
19e60 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
19e70 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
19e80 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
19e90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
19ea0 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
19eb0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
19ec0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
19ed0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
19ee0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
19ef0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
19f00 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
19f10 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
19f20 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
19f30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19f40 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
19f50 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
19f60 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
19f70 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
19f80 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
19f90 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
19fa0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
19fb0 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
19fc0 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
19fd0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
19fe0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
19ff0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1a000 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
1a010 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
1a020 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
1a030 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
1a040 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
1a050 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
1a060 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
1a070 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
1a080 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
1a090 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
1a0a0 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
1a0b0 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
1a0c0 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
1a0d0 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
1a0e0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
1a0f0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1a100 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
1a110 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
1a120 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
1a130 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
1a140 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
1a150 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1a160 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
1a170 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
1a180 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
1a190 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
1a1a0 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
1a1b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1a1c0 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
1a1d0 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
1a1e0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
1a1f0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
1a200 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
1a210 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
1a220 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
1a230 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
1a240 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
1a250 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
1a260 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
1a270 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
1a280 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
1a290 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1a2a0 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
1a2b0 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
1a2c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a2d0 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
1a2e0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
1a2f0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
1a300 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
1a310 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
1a320 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
1a330 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
1a340 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
1a350 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
1a360 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
1a370 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1a380 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
1a390 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
1a3a0 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
1a3b0 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
1a3c0 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
1a3d0 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
1a3e0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
1a3f0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
1a400 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1a410 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1a420 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a430 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1a440 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1a450 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1a460 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1a470 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1a480 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1a490 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
1a4a0 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
1a4b0 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
1a4c0 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1a4d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a4e0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
1a4f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1a500 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1a510 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
1a520 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
1a530 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
1a540 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
1a550 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
1a560 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
1a570 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
1a580 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1a590 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
1a5a0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1a5b0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1a5c0 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
1a5d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1a5e0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1a5f0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a600 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1a610 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a620 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1a630 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
1a640 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1a650 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
1a660 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1a670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1a680 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
1a690 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a6a0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1a6b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a6c0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72   }.    pBt->inTr
1a6d0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1a6e0 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62  S_READ;.  }..  b
1a6f0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1a700 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
1a710 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1a720 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a730 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
1a740 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
1a750 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
1a760 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1a770 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
1a780 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1a790 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1a7a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1a7b0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1a7c0 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
1a7d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a7e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1a7f0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1a800 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
1a810 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1a820 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1a830 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
1a840 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
1a850 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a860 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70  write-cursors op
1a870 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c  en on this handl
1a880 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  e. This is for u
1a890 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
1a8a0 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
1a8b0 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
1a8c0 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
1a8d0 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
1a8e0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
1a8f0 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
1a900 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69  s routine, a wri
1a910 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79  te-cursor is any
1a920 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
1a930 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72  is capable of wr
1a940 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
1a950 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e  abse.  That mean
1a960 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  s the cursor was
1a970 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  .** originally o
1a980 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
1a990 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  g and the cursor
1a9a0 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61   has not be disa
1a9b0 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e  bled.** by havin
1a9c0 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e  g its state chan
1a9d0 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ged to CURSOR_FA
1a9e0 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULT..*/.static i
1a9f0 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  nt countWriteCur
1aa00 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
1aa10 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
1aa20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
1aa30 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
1aa40 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
1aa50 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
1aa60 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
1aa70 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43  ur->wrFlag && pC
1aa80 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1aa90 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1aaa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1aab0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1aac0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
1aad0 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
1aae0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
1aaf0 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
1ab00 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
1ab10 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
1ab20 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  n BtShared that 
1ab30 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
1ab40 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nces..**.** Ever
1ab50 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70  y cursor is trip
1ab60 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
1ab70 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f  ursors that belo
1ab80 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64  ng.** to other d
1ab90 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1aba0 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
1abb0 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a  to be sharing.**
1abc0 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
1abd0 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
1abe0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
1abf0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
1ac00 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a  llback occurs..*
1ac10 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73  * All cursors us
1ac20 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63  ing the same cac
1ac30 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70  he must be tripp
1ac40 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  ed.** to prevent
1ac50 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e   them from tryin
1ac60 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72  g to use the btr
1ac70 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  ee after.** the 
1ac80 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72  rollback.  The r
1ac90 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
1aca0 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a   deleted tables.
1acb0 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74  ** or moved root
1acc0 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73   pages, so it is
1acd0 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
1ace0 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73  to.** save the s
1acf0 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
1ad00 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  or.  The cursor 
1ad10 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
1ad20 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  idated..*/.void 
1ad30 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
1ad40 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
1ad50 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
1ad60 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73  rCode){.  BtCurs
1ad70 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
1ad80 72 65 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ree==0 ) return;
1ad90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1ada0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1adb0 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1adc0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1add0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1ade0 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74  int i;.    sqlit
1adf0 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
1ae00 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53  or(p);.    p->eS
1ae10 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
1ae20 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70  ULT;.    p->skip
1ae30 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
1ae40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
1ae50 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  p->iPage; i++){.
1ae60 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1ae70 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
1ae80 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65  .      p->apPage
1ae90 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1aea0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1aeb0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1aec0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1aed0 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
1aee0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  n in progress.  
1aef0 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  All cursors will
1af00 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64   be.** invalided
1af10 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69   by this operati
1af20 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  on.  Any attempt
1af30 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72   to use a cursor
1af40 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65  .** that was ope
1af50 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  n at the beginni
1af60 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61  ng of this opera
1af70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74  tion will result
1af80 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e  .** in an error.
1af90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1afa0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1afb0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1afc0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1afd0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1afe0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1aff0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1b000 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1b010 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b020 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74  BtreeRollback(Bt
1b030 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70  ree *p, int trip
1b040 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Code){.  int rc;
1b050 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b060 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1b070 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1b080 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1b090 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
1b0a0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
1b0b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
1b0c0 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
1b0d0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1b0e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b0f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b100 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f    }.  if( tripCo
1b110 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  de ){.    sqlite
1b120 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
1b130 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65  sors(p, tripCode
1b140 29 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  );.  }.  btreeIn
1b150 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
1b160 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1b170 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1b180 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
1b190 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
1b1a0 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
1b1b0 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
1b1c0 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
1b1d0 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
1b1e0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1b1f0 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1b200 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1b210 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b220 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1b230 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
1b240 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
1b250 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
1b260 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
1b270 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
1b280 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
1b290 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
1b2a0 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
1b2b0 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
1b2c0 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
1b2d0 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
1b2e0 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
1b2f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1b300 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1b310 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
1b320 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
1b330 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
1b340 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
1b350 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
1b360 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1b370 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
1b380 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
1b390 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
1b3a0 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
1b3b0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1b3c0 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
1b3d0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
1b3e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b3f0 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
1b400 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
1b410 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1b420 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1b430 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
1b440 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1b450 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b460 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b470 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b480 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
1b490 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1b4a0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1b4b0 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65  ction can can be
1b4c0 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1b4d0 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
1b4e0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
1b4f0 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
1b500 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
1b510 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
1b520 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
1b530 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1b540 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
1b550 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
1b560 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
1b570 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
1b580 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
1b590 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
1b5a0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
1b5b0 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
1b5c0 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
1b5d0 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
1b5e0 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
1b5f0 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
1b600 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
1b610 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
1b620 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
1b630 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1b640 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
1b650 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
1b660 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
1b670 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
1b680 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1b690 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
1b6a0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1b6b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
1b6c0 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
1b6d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
1b6e0 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
1b6f0 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1b700 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
1b710 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1b720 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1b730 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
1b740 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
1b750 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
1b760 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
1b770 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
1b780 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
1b790 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
1b7a0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
1b7b0 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
1b7c0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1b7d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
1b7e0 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
1b7f0 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
1b800 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1b810 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
1b820 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
1b830 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
1b840 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
1b850 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
1b860 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b870 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
1b880 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
1b890 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
1b8a0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b8b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1b8c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b8d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1b8e0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1b8f0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
1b900 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1b910 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1b920 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
1b930 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29  ( iStatement>0 )
1b940 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1b950 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53  tement>p->db->nS
1b960 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73  avepoint );.  as
1b970 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
1b980 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
1b990 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74  WRITE );.  /* At
1b9a0 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c   the pager level
1b9b0 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  , a statement tr
1b9c0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73  ansaction is a s
1b9d0 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20  avepoint with.  
1b9e0 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61  ** an index grea
1b9f0 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76  ter than all sav
1ba00 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20  epoints created 
1ba10 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67  explicitly using
1ba20 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
1ba30 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65  ents. It is ille
1ba40 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c  gal to open, rel
1ba50 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  ease or rollback
1ba60 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73   any.  ** such s
1ba70 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
1ba80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
1ba90 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
1baa0 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
1bab0 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1bac0 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1bad0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1bae0 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20  , iStatement);. 
1baf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1bb00 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1bb10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
1bb20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1bb30 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1bb40 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73  n, op, is always
1bb50 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1bb60 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f  ACK.** or SAVEPO
1bb70 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69  INT_RELEASE. Thi
1bb80 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65  s function eithe
1bb90 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f  r releases or ro
1bba0 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20  lls back the.** 
1bbb0 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69  savepoint identi
1bbc0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
1bbd0 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65  r iSavepoint, de
1bbe0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76  pending on the v
1bbf0 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a  alue .** of op..
1bc00 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1bc10 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72  iSavepoint is gr
1bc20 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1bc30 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77  ual to zero. How
1bc40 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a  ever, if op is.*
1bc50 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  * SAVEPOINT_ROLL
1bc60 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65  BACK, then iSave
1bc70 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62  point may also b
1bc80 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61  e -1. In this ca
1bc90 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65  se the .** conte
1bca0 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72  nts of the entir
1bcb0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72  e transaction ar
1bcc0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54  e rolled back. T
1bcd0 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
1bce0 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61  .** from a norma
1bcf0 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  l transaction ro
1bd00 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f  llback, as no lo
1bd10 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64  cks are released
1bd20 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e   and the.** tran
1bd30 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20  saction remains 
1bd40 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  open..*/.int sql
1bd50 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
1bd60 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
1bd70 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
1bd80 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
1bd90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
1bda0 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ( p && p->inTran
1bdb0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1bdc0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1bdd0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1bde0 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41    assert( op==SA
1bdf0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
1be00 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  || op==SAVEPOINT
1be10 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20  _ROLLBACK );.   
1be20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f   assert( iSavepo
1be30 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65  int>=0 || (iSave
1be40 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d  point==-1 && op=
1be50 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
1be60 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  ACK) );.    sqli
1be70 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1be80 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1be90 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e3PagerSavepoint
1bea0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70  (pBt->pPager, op
1beb0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
1bec0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1bed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1bee0 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
1bef0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
1bf00 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
1bf10 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
1bf20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1bf30 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1bf40 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
1bf50 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
1bf60 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
1bf70 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
1bf80 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
1bf90 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  ..      /* The d
1bfa0 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73  atabase size was
1bfb0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
1bfc0 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74  e offset 28 of t
1bfd0 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20  he header.      
1bfe0 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ** when the tran
1bff0 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c  saction started,
1c000 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74   so we know that
1c010 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66   the value at of
1c020 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38  fset.      ** 28
1c030 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a   is nonzero. */.
1c040 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1c050 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
1c060 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
1c070 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1c080 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c090 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
1c0a0 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
1c0b0 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
1c0c0 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
1c0d0 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
1c0e0 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
1c0f0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1c100 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
1c110 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
1c120 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
1c130 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
1c140 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
1c150 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
1c160 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
1c170 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
1c180 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
1c190 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
1c1a0 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
1c1b0 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
1c1c0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1c1d0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c  n..**.** If wrFl
1c1e0 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  ag==0, then the 
1c1f0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20  cursor can only 
1c200 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
1c210 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ing..** If wrFla
1c220 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63  g==1, then the c
1c230 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65  ursor can be use
1c240 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  d for reading or
1c250 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20   for.** writing 
1c260 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69  if other conditi
1c270 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ons for writing 
1c280 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54  are also met.  T
1c290 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20  hese.** are the 
1c2a0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
1c2b0 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f  must be met in o
1c2c0 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67  rder for writing
1c2d0 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65   to.** be allowe
1c2e0 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65  d:.**.** 1:  The
1c2f0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76   cursor must hav
1c300 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69  e been opened wi
1c310 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a  th wrFlag==1.**.
1c320 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74  ** 2:  Other dat
1c330 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1c340 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65  s that share the
1c350 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68   same pager cach
1c360 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69  e.**     but whi
1c370 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  ch are not in th
1c380 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54  e READ_UNCOMMITT
1c390 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74  ED state may not
1c3a0 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72   have.**     cur
1c3b0 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77  sors open with w
1c3c0 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20  rFlag==0 on the 
1c3d0 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68  same table.  Oth
1c3e0 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68  erwise.**     th
1c3f0 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
1c400 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72  y this write cur
1c410 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73  sor would be vis
1c420 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74  ible to.**     t
1c430 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  he read cursors 
1c440 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74  in the other dat
1c450 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1c460 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20  ..**.** 3:  The 
1c470 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
1c480 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f   writable (not o
1c490 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69  n read-only medi
1c4a0 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65  a).**.** 4:  The
1c4b0 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63  re must be an ac
1c4c0 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
1c4d0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b  ..**.** No check
1c4e0 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d  ing is done to m
1c4f0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61  ake sure that pa
1c500 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79  ge iTable really
1c510 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20   is the.** root 
1c520 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65  page of a b-tree
1c530 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c  .  If it is not,
1c540 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1c550 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c   acquired.** wil
1c560 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  l not work corre
1c570 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ctly..**.** It i
1c580 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1c590 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1c5a0 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20  ursorZero() has 
1c5b0 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f  been called.** o
1c5c0 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61  n pCur to initia
1c5d0 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  lize the memory 
1c5e0 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69  space prior to i
1c5f0 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1c600 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tine..*/.static 
1c610 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28  int btreeCursor(
1c620 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1c630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c650 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
1c660 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c680 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1c690 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1c6a0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1c6b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c6d0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
1c6e0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
1c6f0 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
1c700 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
1c710 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
1c720 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66   to comparison f
1c730 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43  unction */.  BtC
1c740 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
1c770 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29   new cursor */.)
1c780 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1c790 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20  t = p->pBt;     
1c7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1c7b0 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64  ared b-tree hand
1c7c0 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
1c7d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1c7e0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1c7f0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1c800 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
1c810 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1c820 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
1c830 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
1c840 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
1c850 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
1c860 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
1c870 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
1c880 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
1c890 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
1c8a0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
1c8b0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
1c8c0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
1c8d0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
1c8e0 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
1c8f0 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
1c900 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
1c910 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
1c920 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
1c930 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
1c940 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
1c950 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1c960 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
1c970 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
1c980 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
1c990 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
1c9a0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
1c9b0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
1c9c0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
1c9d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1c9e0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
1c9f0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
1ca00 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
1ca10 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
1ca20 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
1ca30 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
1ca40 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69  1->aData );..  i
1ca50 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20  f( NEVER(wrFlag 
1ca60 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
1ca70 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1ca80 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65  Y)!=0) ){.    re
1ca90 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
1caa0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
1cab0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
1cac0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1cad0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1cae0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
1caf0 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
1cb00 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
1cb10 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
1cb20 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
1cb30 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
1cb40 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
1cb50 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
1cb60 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
1cb70 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
1cb80 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
1cb90 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
1cba0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
1cbb0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
1cbc0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
1cbd0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1cbe0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
1cbf0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
1cc00 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46  pBt;.  pCur->wrF
1cc10 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67  lag = (u8)wrFlag
1cc20 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  ;.  pCur->pNext 
1cc30 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
1cc40 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1cc50 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
1cc60 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1cc70 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70  ur;.  }.  pBt->p
1cc80 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
1cc90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1cca0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1ccb0 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f    pCur->cachedRo
1ccc0 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  wid = 0;.  retur
1ccd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
1cce0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1ccf0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1cd00 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1cd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
1cd30 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
1cd40 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1cd70 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1cd80 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1cd90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1cdc0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1cdd0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1cde0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ce00 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
1ce10 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
1ce20 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1ce50 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
1ce60 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1ce70 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1ce80 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1ce90 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
1cea0 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
1ceb0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
1cec0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1ced0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1cee0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cef0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1cf00 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
1cf10 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
1cf20 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
1cf30 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
1cf40 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
1cf50 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
1cf60 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
1cf70 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
1cf80 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
1cf90 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
1cfa0 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
1cfb0 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
1cfc0 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
1cfd0 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
1cfe0 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
1cff0 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
1d000 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
1d010 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1d020 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
1d030 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
1d040 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
1d050 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1d060 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
1d070 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
1d080 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
1d090 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
1d0a0 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
1d0b0 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
1d0c0 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
1d0d0 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
1d0e0 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
1d0f0 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
1d100 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
1d110 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
1d120 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
1d130 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
1d140 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
1d150 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
1d160 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
1d170 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
1d180 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
1d190 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
1d1a0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
1d1b0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d1c0 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
1d1d0 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
1d1e0 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
1d1f0 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
1d200 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1d210 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61   cached rowid va
1d220 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72  lue of every cur
1d230 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20  sor in the same 
1d240 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1d250 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76   as pCur and hav
1d260 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ing the same roo
1d270 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  t page number as
1d280 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75   pCur.  The valu
1d290 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69  e is.** set to i
1d2a0 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  Rowid..**.** Onl
1d2b0 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64  y positive rowid
1d2c0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1d2d0 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72  idered valid for
1d2e0 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20   this cache..** 
1d2f0 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69  The cache is ini
1d300 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1d310 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
1d320 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a  invalid cache..*
1d330 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77  * A btree will w
1d340 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65  ork fine with ze
1d350 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1d360 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20  owids.  We just 
1d370 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20  cannot.** cache 
1d380 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1d390 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d   rowids, which m
1d3a0 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74  eans tables that
1d3b0 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20   use zero or.** 
1d3c0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1d3d0 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
1d3e0 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20  le slower.  But 
1d3f0 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72  in practice, zer
1d400 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65  o.** or negative
1d410 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79   rowids are very
1d420 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69   uncommon so thi
1d430 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
1d440 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
1d450 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  id sqlite3BtreeS
1d460 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1d470 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71  Cursor *pCur, sq
1d480 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77  lite3_int64 iRow
1d490 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  id){.  BtCursor 
1d4a0 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72  *p;.  for(p=pCur
1d4b0 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
1d4c0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1d4d0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
1d4e0 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  oot==pCur->pgnoR
1d4f0 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52  oot ) p->cachedR
1d500 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1d510 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1d520 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d  r->cachedRowid==
1d530 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a  iRowid );.}../*.
1d540 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61  ** Return the ca
1d550 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74  ched rowid for t
1d560 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e  he given cursor.
1d570 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20    A negative or 
1d580 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76  zero.** return v
1d590 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74  alue indicates t
1d5a0 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61  hat the rowid ca
1d5b0 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61  che is invalid a
1d5c0 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  nd should be.** 
1d5d0 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65  ignored.  If the
1d5e0 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73   rowid cache has
1d5f0 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1d600 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a  en set, then a.*
1d610 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * zero is return
1d620 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  ed..*/.sqlite3_i
1d630 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  nt64 sqlite3Btre
1d640 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eGetCachedRowid(
1d650 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d660 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1d670 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a  cachedRowid;.}..
1d680 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
1d690 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
1d6a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1d6b0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
1d6c0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
1d6d0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
1d6e0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
1d6f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
1d700 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
1d710 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
1d720 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
1d730 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
1d740 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
1d750 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
1d760 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1d770 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1d780 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1d790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1d7a0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1d7b0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
1d7c0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
1d7d0 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
1d7e0 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
1d7f0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1d800 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
1d810 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
1d820 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1d830 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1d840 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1d850 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
1d860 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
1d870 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1d880 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1d890 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d8a0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1d8b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
1d8c0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1d8d0 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
1d8e0 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
1d8f0 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
1d900 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1d910 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
1d920 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1d930 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
1d940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d950 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1d960 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
1d970 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1d980 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
1d990 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
1d9a0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
1d9b0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1d9c0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
1d9d0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
1d9e0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
1d9f0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
1da00 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
1da10 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
1da20 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
1da30 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
1da40 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
1da50 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
1da60 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
1da70 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
1da80 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
1da90 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
1daa0 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
1dab0 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
1dac0 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
1dad0 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
1dae0 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
1daf0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1db00 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
1db10 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
1db20 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
1db30 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
1db40 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
1db50 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
1db60 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
1db70 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
1db80 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
1db90 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
1dba0 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
1dbb0 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
1dbc0 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
1dbd0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1dbe0 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
1dbf0 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
1dc00 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
1dc10 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
1dc20 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1dc30 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
1dc40 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
1dc50 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1dc60 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1dc70 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
1dc80 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1dc90 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
1dca0 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
1dcb0 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
1dcc0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1dcd0 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
1dce0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
1dcf0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
1dd00 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
1dd10 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
1dd20 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
1dd30 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
1dd40 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
1dd50 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
1dd60 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
1dd70 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
1dd80 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
1dd90 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
1dda0 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
1ddb0 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
1ddc0 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
1ddd0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1dde0 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
1ddf0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1de00 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
1de10 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1de20 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
1de30 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1de40 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1de50 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1de60 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
1de70 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1de80 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
1de90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
1dea0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1deb0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
1dec0 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
1ded0 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
1dee0 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
1def0 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
1df00 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
1df10 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
1df20 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
1df30 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1df70 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1df80 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1dfc0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1dfd0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20   pCur->iPage;   
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e010 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  \.    btreeParse
1e020 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1e030 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1e040 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1e050 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20  r->info); \.    
1e060 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1e070 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1e0b0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e100 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1e110 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e150 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
1e160 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65  C_VER */..#ifnde
1e170 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
1e180 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
1e190 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1e1a0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1e1b0 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
1e1c0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
1e1d0 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
1e1e0 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
1e1f0 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
1e200 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
1e210 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
1e220 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
1e230 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
1e240 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
1e250 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
1e260 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
1e270 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1e280 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
1e290 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1e2a0 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
1e2b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1e2c0 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
1e2d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1e2e0 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
1e2f0 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
1e300 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1e310 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1e320 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
1e330 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
1e340 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
1e350 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1e360 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
1e370 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1e380 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
1e390 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
1e3a0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
1e3b0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
1e3c0 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
1e3d0 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
1e3e0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1e3f0 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
1e400 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
1e410 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1e420 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
1e430 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
1e440 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
1e450 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
1e460 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1e470 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
1e480 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
1e490 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
1e4a0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1e4b0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
1e4c0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
1e4d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1e4e0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
1e4f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e500 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e510 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e520 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1e530 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
1e540 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e550 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
1e560 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1e570 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1e580 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65  *pSize = 0;.  }e
1e590 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c  lse{.    getCell
1e5a0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1e5b0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1e5c0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1e5d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e5e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
1e5f0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
1e600 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1e610 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
1e620 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
1e630 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1e640 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
1e650 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
1e660 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
1e670 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1e680 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
1e690 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
1e6a0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1e6b0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1e6c0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
1e6d0 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
1e6e0 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
1e6f0 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
1e700 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
1e710 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1e720 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
1e730 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
1e740 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1e750 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
1e760 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
1e770 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
1e780 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
1e790 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
1e7a0 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
1e7b0 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
1e7c0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
1e7d0 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
1e7e0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1e7f0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1e800 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1e810 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e820 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e830 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1e840 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1e850 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
1e860 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1e870 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1e880 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72  >info.nData;.  r
1e890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e8a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1e8b0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e8c0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
1e8d0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
1e8e0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
1e8f0 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
1e900 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1e910 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e920 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1e930 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
1e940 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
1e950 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
1e960 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
1e970 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1e980 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
1e990 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
1e9a0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
1e9b0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
1e9c0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
1e9d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e9e0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e9f0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1ea00 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
1ea10 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
1ea20 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1ea30 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1ea40 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1ea50 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1ea60 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
1ea70 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
1ea80 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1ea90 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
1eaa0 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
1eab0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
1eac0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
1ead0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
1eae0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
1eaf0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
1eb00 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
1eb10 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
1eb20 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
1eb30 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
1eb40 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
1eb50 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
1eb60 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
1eb70 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1eb80 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1eb90 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
1eba0 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
1ebb0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
1ebc0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
1ebd0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
1ebe0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
1ebf0 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
1ec00 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
1ec10 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
1ec20 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
1ec30 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
1ec40 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
1ec50 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
1ec60 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
1ec70 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1ec80 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
1ec90 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1eca0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
1ecb0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1ecc0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1ecd0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1ece0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
1ecf0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1ed00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1ed10 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
1ed20 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
1ed30 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
1ed40 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
1ed50 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
1ed60 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1ed70 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
1ed80 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
1ed90 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1eda0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1edb0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1edc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1edd0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1ede0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
1edf0 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
1ee00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ee10 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
1ee20 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
1ee30 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1ee40 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
1ee50 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
1ee60 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
1ee70 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
1ee80 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
1ee90 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
1eea0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
1eeb0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
1eec0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
1eed0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
1eee0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
1eef0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
1ef00 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
1ef10 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
1ef20 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
1ef30 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
1ef40 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
1ef50 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1ef60 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
1ef70 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
1ef80 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
1ef90 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
1efa0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
1efb0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1efc0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
1efd0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
1efe0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1eff0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
1f000 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
1f010 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
1f020 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
1f030 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1f040 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
1f050 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
1f060 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f070 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
1f080 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1f090 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
1f0a0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
1f0b0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
1f0c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1f0d0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1f0e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1f0f0 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
1f100 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
1f110 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
1f120 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f130 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1f140 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1f150 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1f160 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1f170 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
1f180 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f190 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f1a0 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1f1b0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1f1c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1f1d0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1f1e0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1f1f0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1f200 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1f210 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1f220 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1f230 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1f240 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1f250 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1f260 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1f270 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
1f280 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
1f290 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
1f2a0 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
1f2b0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1f2c0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
1f2d0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1f2e0 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
1f2f0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
1f300 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
1f310 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
1f320 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
1f330 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
1f340 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
1f350 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
1f360 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
1f370 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f380 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1f390 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
1f3a0 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
1f3b0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
1f3c0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1f3d0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
1f3e0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1f3f0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1f400 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
1f410 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
1f420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f430 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
1f440 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
1f450 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1f460 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
1f470 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1f480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f490 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1f4a0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
1f4b0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
1f4c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f4d0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1f4e0 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f500 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
1f510 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
1f520 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
1f530 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
1f540 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
1f550 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
1f560 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
1f570 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
1f580 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
1f590 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
1f5a0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
1f5b0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
1f5c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f5d0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1f5e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f5f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f600 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
1f610 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1f620 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
1f630 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
1f640 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
1f650 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
1f660 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
1f670 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
1f680 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
1f690 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
1f6a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f6b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f6c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1f6d0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
1f6e0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1f6f0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
1f700 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
1f710 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1f720 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
1f730 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
1f740 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
1f750 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
1f760 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
1f770 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
1f780 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
1f790 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
1f7a0 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
1f7b0 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
1f7c0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
1f7d0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
1f7e0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
1f7f0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
1f800 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
1f810 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
1f820 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1f830 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
1f840 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
1f850 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
1f860 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
1f870 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
1f880 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1f890 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1f8a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
1f8b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
1f8c0 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
1f8d0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1f8e0 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
1f8f0 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
1f900 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
1f910 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
1f920 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
1f930 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
1f940 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
1f950 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
1f960 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1f970 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
1f980 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
1f990 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
1f9a0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
1f9b0 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
1f9c0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
1f9d0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
1f9e0 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
1f9f0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
1fa00 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1fa10 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1fa20 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1fa30 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
1fa40 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
1fa50 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
1fa60 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
1fa70 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
1fa80 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1fa90 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
1faa0 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
1fab0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
1fac0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
1fad0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
1fae0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
1faf0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
1fb00 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1fb10 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
1fb20 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1fb30 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1fb40 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1fb50 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1fb60 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1fb70 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1fb80 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1fb90 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1fba0 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1fbb0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1fbc0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1fbd0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1fbe0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1fbf0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1fc00 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1fc10 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1fc20 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1fc30 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1fc40 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1fc50 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1fc60 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1fc70 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1fc80 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1fc90 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1fca0 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1fcb0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
1fcc0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
1fcd0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
1fce0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
1fcf0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1fd00 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
1fd10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fd20 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
1fd30 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
1fd40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1fd50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fd60 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
1fd70 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
1fd80 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
1fd90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fda0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
1fdb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1fdc0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
1fdd0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
1fde0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
1fdf0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1fe00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1fe10 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1fe20 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1fe30 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1fe40 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1fe50 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1fe60 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1fe70 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
1fe80 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1fe90 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1fea0 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
1feb0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
1fec0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
1fed0 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
1fee0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
1fef0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
1ff00 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
1ff10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
1ff20 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
1ff30 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1ff40 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
1ff50 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
1ff60 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
1ff70 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
1ff80 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
1ff90 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1ffa0 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
1ffb0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1ffc0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ffd0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1ffe0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
1fff0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
20000 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
20010 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
20020 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
20030 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20040 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
20050 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
20060 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
20070 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
20080 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
20090 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
200a0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
200b0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
200c0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
200d0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
200e0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
200f0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
20100 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
20110 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
20120 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
20130 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
20140 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
20150 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20160 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
20170 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
20180 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
20190 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
201a0 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
201b0 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
201c0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
201d0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
201e0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
201f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20200 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
20210 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
20220 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
20230 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
20240 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
20250 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
20260 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
20270 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
20280 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
20290 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
202a0 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
202b0 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
202c0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
202d0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
202e0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
202f0 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
20300 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
20310 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
20320 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
20330 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
20340 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
20350 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
20360 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
20370 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
20380 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
20390 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
203a0 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
203b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
203c0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
203d0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
203e0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
203f0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
20400 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
20410 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
20420 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
20430 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
20440 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
20450 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
20460 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
20470 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
20480 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69        /* nOvfl i
20490 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  s always positiv
204a0 65 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a  e.  If it were z
204b0 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61  ero, fetchPayloa
204c0 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20  d would have.   
204d0 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20     ** been used 
204e0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20  instead of this 
204f0 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  routine. */.    
20500 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76    if( ALWAYS(nOv
20510 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  fl) && !pCur->aO
20520 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
20530 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
20540 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
20550 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
20560 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
20570 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
20580 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
20590 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
205a0 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
205b0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
205c0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
205d0 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
205e0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
205f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
20600 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
20610 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
20620 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
20630 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
20640 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
20650 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
20660 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
20670 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
20680 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
20690 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
206a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
206b0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
206c0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
206d0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
206e0 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
206f0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
20700 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
20710 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
20720 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
20730 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
20740 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
20750 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
20760 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
20770 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
20780 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
20790 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
207a0 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
207b0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
207c0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
207d0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
207e0 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
207f0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
20800 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
20810 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
20820 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
20830 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
20840 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
20850 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
20860 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
20870 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
20880 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
20890 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
208a0 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
208b0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
208c0 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
208d0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
208e0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
208f0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
20900 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
20910 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
20920 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
20930 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
20940 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
20950 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
20960 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
20970 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
20980 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
20990 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
209a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
209b0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
209c0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
209d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
209e0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
209f0 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
20a00 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
20a10 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
20a20 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
20a30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20a40 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
20a50 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
20a60 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
20a70 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
20a80 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
20a90 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
20aa0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
20ab0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
20ac0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
20ad0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
20ae0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
20af0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
20b00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
20b10 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
20b20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
20b30 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
20b40 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
20b50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
20b60 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
20b70 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
20b80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
20b90 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
20ba0 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
20bb0 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
20bc0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
20bd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
20be0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
20bf0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
20c00 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
20c10 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
20c20 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
20c30 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
20c40 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
20c50 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
20c60 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
20c70 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
20c80 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
20c90 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
20ca0 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
20cb0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
20cc0 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
20cd0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
20ce0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
20cf0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20d00 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
20d10 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
20d20 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
20d30 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
20d40 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
20d50 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
20d60 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
20d70 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
20d80 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
20d90 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
20da0 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
20db0 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
20dc0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
20dd0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20de0 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20       if( eOp==0 
20df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
20e20 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
20e30 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e60 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
20e70 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
20e80 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
20e90 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20eb0 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
20ec0 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
20ed0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
20ee0 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
20ef0 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
20f00 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
20f10 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20f20 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
20f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f40 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
20f50 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
20f60 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
20f70 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
20f80 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
20f90 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
20fa0 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
20fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20fc0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
20fd0 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
20fe0 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
20ff0 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
21000 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
21010 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
21020 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
21030 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
21040 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
21050 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
21060 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
21070 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
21080 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
21090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
210a0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
210b0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
210c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
210d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
210e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
210f0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
21100 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
21110 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
21120 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
21130 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
21140 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
21150 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
21160 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
21170 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
21180 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
21190 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
211a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
211b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
211c0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
211d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
211e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
211f0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
21200 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
21210 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
21220 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21230 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
21240 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21250 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21260 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21270 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
21280 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
21290 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
212a0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
212b0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
212c0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
212d0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
212e0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
212f0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
21300 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54  offset"..**.** T
21310 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
21320 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20  nsure that pCur 
21330 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
21340 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e   valid row.** in
21350 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
21360 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
21370 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
21380 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
21390 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
213a0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
213b0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
213c0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
213d0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
213e0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
213f0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
21400 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
21410 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21420 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
21430 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
21440 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
21450 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21460 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21470 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21480 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21490 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
214a0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
214b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
214c0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
214d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
214e0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
214f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21500 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
21510 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
21520 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
21530 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
21540 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29  d char*)pBuf, 0)
21550 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
21560 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
21570 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21580 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
21590 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
215a0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
215b0 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
215c0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
215d0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
215e0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
215f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21600 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
21610 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
21620 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
21630 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
21640 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
21650 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
21660 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
21670 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
21680 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
21690 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
216a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
216b0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
216c0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
216d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
216e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
216f0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
21700 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21710 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
21720 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21730 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
21740 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
21750 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21760 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
21770 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
21780 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
21790 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
217a0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
217b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
217c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
217d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
217e0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
217f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21800 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73  iPage] );.    as
21810 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
21820 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
21830 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21840 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
21850 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
21860 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
21870 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
21880 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
21890 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
218a0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
218b0 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
218c0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
218d0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
218e0 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
218f0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
21900 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
21910 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
21920 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
21930 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e  if skipKey==0 an
21940 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  d it points to t
21950 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
21960 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b  data if.** skipK
21970 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62  ey==1.  The numb
21980 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
21990 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74  vailable key/dat
219a0 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  a is written.** 
219b0 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
219c0 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
219d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
219e0 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a  d will not be.**
219f0 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
21a00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21a10 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
21a20 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
21a30 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
21a40 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
21a50 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
21a60 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
21a70 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
21a80 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
21a90 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
21aa0 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
21ab0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
21ac0 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
21ad0 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
21ae0 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
21af0 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
21b00 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
21b10 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
21b20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
21b30 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
21b40 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
21b50 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
21b60 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
21b70 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
21b80 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
21b90 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
21ba0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
21bb0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
21bc0 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
21bd0 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
21be0 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
21bf0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
21c00 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
21c10 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
21c20 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
21c30 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
21c40 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
21c50 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
21c60 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c   char *fetchPayl
21c70 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
21c80 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
21c90 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
21ca0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
21cb0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
21cc0 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Amt,           /
21cd0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
21ce0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
21cf0 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  bytes here */.  
21d00 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20  int skipKey     
21d10 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67       /* read beg
21d20 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69  inning at data i
21d30 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
21d40 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
21d50 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
21d60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21d70 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
21d80 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61  u32 nLocal;..  a
21d90 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
21da0 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
21db0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
21dc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
21dd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21de0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21df0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
21e00 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21e10 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50  ex(pCur) );.  pP
21e20 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
21e30 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
21e40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21e50 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21e60 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
21e70 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
21e80 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
21e90 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65  ==0) ){.    btre
21ea0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
21eb0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21ec0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
21ed0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a  x[pCur->iPage],.
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ef0 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b     &pCur->info);
21f00 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20  .  }.  aPayload 
21f10 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
21f20 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
21f30 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
21f40 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
21f50 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
21f60 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
21f70 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28  se{.    nKey = (
21f80 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
21f90 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
21fa0 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
21fb0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
21fc0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
21fd0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
21fe0 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
21ff0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
22000 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
22010 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63      assert( nLoc
22020 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a  al<=nKey );.  }.
22030 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
22040 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
22050 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
22060 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
22070 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
22080 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
22090 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
220a0 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
220b0 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
220c0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
220d0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
220e0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
220f0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
22100 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
22110 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
22120 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
22130 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
22140 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
22150 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
22160 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
22170 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
22180 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
22190 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
221a0 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
221b0 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
221c0 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
221d0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
221e0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
221f0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
22200 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
22210 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
22220 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
22230 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
22240 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
22250 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
22260 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
22270 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
22280 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
22290 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
222a0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
222b0 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
222c0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
222d0 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74   *pAmt){.  const
222e0 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20   void *p = 0;.  
222f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22300 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
22310 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
22320 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
22330 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22340 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
22350 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53   ALWAYS(pCur->eS
22360 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22370 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  ID) ){.    p = (
22380 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
22390 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
223a0 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 0);.  }.  r
223b0 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74  eturn p;.}.const
223c0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
223d0 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
223e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
223f0 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74   *pAmt){.  const
22400 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20   void *p = 0;.  
22410 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22420 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
22430 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
22440 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
22450 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22460 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
22470 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53   ALWAYS(pCur->eS
22480 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22490 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  ID) ){.    p = (
224a0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
224b0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
224c0 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
224d0 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn p;.}.../*.
224e0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
224f0 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
22500 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
22510 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
22520 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
22530 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
22540 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
22550 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
22560 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
22570 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
22580 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
22590 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
225a0 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
225b0 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
225c0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
225d0 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
225e0 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
225f0 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
22600 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
22610 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
22620 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
22630 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
22640 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
22650 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
22660 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
22670 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
22680 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
22690 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
226a0 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
226b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
226c0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
226d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
226e0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
226f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22700 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22710 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
22720 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
22730 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
22740 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43  EPTH );.  if( pC
22750 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
22760 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
22770 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
22780 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22790 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
227a0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
227b0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
227c0 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  ewPage);.  if( r
227d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
227e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
227f0 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
22800 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
22810 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
22820 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
22830 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
22840 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
22850 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  ey = 0;.  if( pN
22860 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
22870 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74  || pNewPage->int
22880 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67  Key!=pCur->apPag
22890 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[i]->intKey ){.
228a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
228b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
228c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
228d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30  ITE_OK;.}..#if 0
228e0 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
228f0 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
22900 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
22910 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
22920 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
22930 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
22940 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
22950 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
22960 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
22970 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
22980 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
22990 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
229a0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
229b0 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
229c0 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
229d0 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
229e0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
229f0 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
22a00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22a10 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
22a20 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
22a30 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
22a40 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
22a50 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
22a60 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
22a70 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
22a80 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
22a90 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
22aa0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
22ab0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
22ac0 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
22ad0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22ae0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
22af0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
22b00 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
22b10 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
22b20 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
22b30 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
22b40 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
22b50 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
22b60 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
22b70 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
22b80 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
22b90 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
22ba0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
22bb0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
22bc0 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
22bd0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
22be0 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
22bf0 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
22c00 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
22c10 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
22c20 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
22c30 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
22c40 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
22c50 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
22c60 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
22c70 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
22c80 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
22c90 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
22ca0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
22cb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
22cc0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
22cd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
22ce0 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Page>0 );.  asse
22cf0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22d00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
22d10 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a 20 49  ..  /* UPDATE: I
22d20 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 70 6f  t is actually po
22d30 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 63  ssible for the c
22d40 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65 64 20  ondition tested 
22d50 62 79 20 74 68 65 20 61 73 73 65 72 74 0a 20 20  by the assert.  
22d60 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65 20 75  ** below to be u
22d70 6e 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74  ntrue if the dat
22d80 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
22d90 72 72 75 70 74 2e 20 54 68 69 73 20 63 61 6e 20  rrupt. This can 
22da0 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20 6f 6e  occur if.  ** on
22db0 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 64  e cursor has mod
22dc0 69 66 69 65 64 20 70 61 67 65 20 70 50 61 72 65  ified page pPare
22dd0 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66 65 72  nt while a refer
22de0 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20 68 65  ence to it is he
22df0 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20 73 65  ld .  ** by a se
22e00 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57 68 69  cond cursor. Whi
22e10 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
22e20 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70  en if a single p
22e30 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a 20 20  age is linked.  
22e40 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ** into more tha
22e50 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
22e60 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f 72 72  ucture in a corr
22e70 75 70 74 20 64 61 74 61 62 61 73 65 2e 20 20 2a  upt database.  *
22e80 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
22e90 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
22ea0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
22eb0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
22ec0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
22ed0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
22ee0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
22ef0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
22f00 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  gno.  );.#endif.
22f10 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
22f20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
22f30 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
22f40 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22f50 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  e-1]->nCell );..
22f60 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
22f70 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22f80 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72  >iPage]);.  pCur
22f90 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75  ->iPage--;.  pCu
22fa0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
22fb0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
22fc0 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  NKey = 0;.}../*.
22fd0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
22fe0 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
22ff0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
23000 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
23010 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
23020 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
23030 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
23040 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
23050 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
23060 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
23070 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
23080 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
23090 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
230a0 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
230b0 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
230c0 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
230d0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
230e0 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
230f0 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
23100 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
23110 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
23120 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
23130 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
23140 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
23150 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
23160 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
23170 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
23180 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
23190 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
231a0 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
231b0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
231c0 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
231d0 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
231e0 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
231f0 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
23200 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
23210 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
23220 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
23230 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
23240 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
23250 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
23260 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
23270 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
23280 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
23290 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
232a0 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
232b0 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
232c0 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
232d0 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
232e0 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
232f0 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
23300 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
23310 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
23320 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
23330 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
23340 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
23350 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
23360 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
23370 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
23380 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
23390 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
233a0 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
233b0 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
233c0 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
233d0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
233e0 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
233f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
23400 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
23410 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
23420 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
23430 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
23440 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
23450 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
23460 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23470 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
23480 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23490 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
234a0 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
234b0 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
234c0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
234d0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
234e0 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
234f0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
23500 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
23510 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
23520 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
23530 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
23540 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
23550 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
23560 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
23570 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
23580 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
23590 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
235a0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
235b0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
235c0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
235d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
235e0 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
235f0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
23600 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
23610 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
23620 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =1; i<=pCur->iPa
23630 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
23640 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
23650 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
23660 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
23670 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  age = 0;.  }else
23680 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
23690 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
236a0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
236b0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
236c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
236d0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
236e0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
236f0 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
23700 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
23710 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20  apPage[0]);.    
23720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23730 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
23740 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
23750 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
23760 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
23770 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
23780 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 0;..    /* If
23790 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
237a0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
237b0 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
237c0 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
237d0 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65  rsor.    ** expe
237e0 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
237f0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
23800 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
23810 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
23820 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
23830 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
23840 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
23850 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
23860 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65   case,.    ** re
23870 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
23880 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a  ORRUPT error.  *
23890 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  /.    assert( pC
238a0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
238b0 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72  ntKey==1 || pCur
238c0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
238d0 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Key==0 );.    if
238e0 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ( (pCur->pKeyInf
238f0 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50  o==0)!=pCur->apP
23900 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
23910 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
23920 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23930 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
23940 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
23950 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
23960 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
23970 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20  type. This must 
23980 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65  be the.  ** case
23990 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   as the call to 
239a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68  this function th
239b0 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f  at loaded the ro
239c0 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a  ot-page (either.
239d0 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f    ** this call o
239e0 72 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76  r a previous inv
239f0 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68  ocation) would h
23a00 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
23a10 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66  ruption .  ** if
23a20 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20   the assumption 
23a30 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
23a40 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  nd it is not pos
23a50 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c  sible for the fl
23a60 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74  ags .  ** byte t
23a70 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  o have been modi
23a80 66 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20  fied while this 
23a90 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e  cursor is holdin
23aa0 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  g a reference.  
23ab0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20  ** to the page. 
23ac0 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   */.  pRoot = pC
23ad0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
23ae0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
23af0 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
23b00 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Root );.  assert
23b10 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20  ( pRoot->isInit 
23b20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  && (pCur->pKeyIn
23b30 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69  fo==0)==pRoot->i
23b40 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72  ntKey );..  pCur
23b50 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
23b60 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23b70 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
23b80 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
23b90 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
23ba0 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0;..  if( pRoot-
23bb0 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
23bc0 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
23bd0 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
23be0 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
23bf0 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
23c00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23c10 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
23c20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
23c30 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
23c40 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
23c50 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
23c60 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
23c70 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
23c80 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
23c90 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
23ca0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
23cb0 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e   ((pRoot->nCell>
23cc0 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
23cd0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
23ce0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
23d00 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
23d10 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
23d20 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
23d30 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
23d40 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
23d50 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
23d60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
23d70 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
23d80 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
23d90 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
23da0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
23db0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
23dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
23dd0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
23de0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23df0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
23e00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23e10 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
23e20 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
23e30 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23e40 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23e50 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23e60 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23e70 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
23e80 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
23e90 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
23ea0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
23eb0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
23ec0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
23ed0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
23ee0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
23ef0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
23f00 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
23f10 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
23f20 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
23f30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
23f40 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
23f50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
23f70 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
23f80 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
23f90 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
23fa0 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
23fb0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
23fc0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
23fd0 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
23fe0 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
23ff0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
24000 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
24010 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
24020 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
24030 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
24040 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
24050 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
24060 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
24070 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
24080 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
24090 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
240a0 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
240b0 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
240c0 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
240d0 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
240e0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
240f0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
24100 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
24110 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
24120 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
24130 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
24140 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
24150 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24160 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
24170 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
24180 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24190 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
241a0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
241b0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
241c0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
241d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
241e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
241f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
24200 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
24210 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
24220 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
24230 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
24240 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
24250 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
24260 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
24270 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
24280 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
24290 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
242a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
242b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
242c0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
242d0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70  ->nCell-1;.    p
242e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
242f0 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
24300 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
24310 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24320 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
24330 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
24340 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
24350 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
24360 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
24370 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
24380 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
24390 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
243a0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
243b0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
243c0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
243d0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
243e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
243f0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
24400 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
24410 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
24420 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
24430 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
24440 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24450 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
24460 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
24470 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
24480 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
24490 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
244a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
244b0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
244c0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
244d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
244e0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
244f0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
24500 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
24510 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
24520 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
24530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
24540 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
24550 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24560 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
24570 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
24580 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
24590 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
245a0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
245b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
245c0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
245d0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
245e0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
245f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
24600 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
24610 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
24620 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
24630 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
24640 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
24650 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
24660 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
24670 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
24680 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
24690 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
246a0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
246b0 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
246c0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
246d0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
246e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
246f0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
24700 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
24710 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
24720 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
24730 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
24740 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
24750 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
24760 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
24770 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70  Cur->eState && p
24780 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23  Cur->atLast ){.#
24790 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
247a0 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
247b0 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
247c0 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
247d0 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
247e0 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
247f0 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
24800 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
24810 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
24820 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
24830 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
24840 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
24850 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
24860 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
24870 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
24880 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
24890 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
248a0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
248b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
248c0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
248d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
248e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
248f0 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
24900 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
24910 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
24920 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
24930 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
24940 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24950 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
24960 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
24970 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
24980 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24990 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
249a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
249b0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
249c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
249d0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
249e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
249f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
24a00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
24a10 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
24a20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
24a30 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
24a40 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c  .      pCur->atL
24a50 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45  ast = rc==SQLITE
24a60 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a  _OK ?1:0;.    }.
24a70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24a80 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
24a90 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
24aa0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
24ab0 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
24ac0 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
24ad0 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
24ae0 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
24af0 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
24b00 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
24b10 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
24b20 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
24b30 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
24b40 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
24b50 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
24b60 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
24b70 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
24b80 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
24b90 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
24ba0 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
24bb0 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
24bc0 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
24bd0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
24be0 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
24bf0 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
24c00 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
24c10 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
24c20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
24c30 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
24c40 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
24c50 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
24c60 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
24c70 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
24c80 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
24c90 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
24ca0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
24cb0 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
24cc0 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
24cd0 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
24ce0 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
24cf0 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
24d00 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
24d10 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
24d20 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
24d30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
24d40 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
24d50 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
24d60 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
24d70 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
24d80 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
24d90 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
24da0 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
24db0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
24dc0 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
24dd0 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
24de0 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
24df0 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
24e00 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
24e10 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
24e20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
24e30 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
24e40 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
24e70 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
24e80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
24e90 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
24ea0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
24eb0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
24ec0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
24ed0 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
24ee0 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
24ef0 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
24f00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
24f10 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
24f20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
24f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24f40 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
24f50 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
24f60 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
24f70 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
24f80 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
24f90 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
24fa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
24fb0 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
24fc0 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
24fd0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
24fe0 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
24ff0 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
25000 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25020 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
25030 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
25040 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
25050 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
25060 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
25070 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
25080 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
25090 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
250a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
250b0 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
250c0 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
250d0 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
250e0 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
250f0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
25100 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
25110 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
25120 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
25130 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
25140 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
25150 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
25160 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
25170 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25180 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
25190 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
251a0 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50  .   && pCur->apP
251b0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a  age[0]->intKey .
251c0 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75    ){.    if( pCu
251d0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
251e0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
251f0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
25200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25210 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
25220 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70  Cur->atLast && p
25230 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
25240 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
25250 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
25260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25270 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
25280 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
25290 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
252a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
252b0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
252c0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
252d0 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
252e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
252f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
25300 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
25310 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
25320 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
25330 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
25340 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
25350 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
25360 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25370 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25380 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
25390 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
253a0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
253b0 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
253c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
253d0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
253e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
253f0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
25400 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
25410 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
25420 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
25430 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
25440 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
25450 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
25460 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a   lwr, upr, idx;.
25470 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
25480 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
25490 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
254a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
254b0 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20  .    int c;..   
254c0 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
254d0 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
254e0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
254f0 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
25500 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
25510 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
25520 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
25530 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
25540 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
25550 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
25560 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
25570 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
25580 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
25590 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
255a0 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
255b0 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
255c0 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
255d0 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
255e0 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
255f0 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
25600 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
25610 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
25620 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
25630 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
25640 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
25650 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
25660 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
25670 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
25680 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
25690 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
256a0 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
256b0 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
256c0 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
256d0 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
256e0 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73  -1;.    if( bias
256f0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
25700 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25710 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
25720 69 64 78 20 3d 20 75 70 72 29 3b 0a 20 20 20 20  idx = upr);.    
25730 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
25740 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
25750 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64  Page] = (u16)(id
25760 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 29  x = (upr+lwr)/2)
25770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
25780 3b 3b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ;;){.      u8 *p
25790 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
257b0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
257c0 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
257d0 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ge */..      ass
257e0 65 72 74 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e  ert( idx==pCur->
257f0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25800 65 5d 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  e] );.      pCur
25810 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
25820 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
25830 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
25840 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
25850 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
25860 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
25870 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
25880 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
25890 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
258a0 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
258b0 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
258c0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
258d0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
258e0 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  Cell, dummy);.  
258f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25900 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
25910 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
25920 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
25930 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
25940 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
25950 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
25960 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69  e if( nCellKey<i
25970 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
25980 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20     c = -1;.     
25990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
259a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
259b0 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  lKey>intKey );. 
259c0 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
259d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
259e0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
259f0 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ey = 1;.        
25a00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
25a10 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
25a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25a30 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
25a40 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
25a50 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
25a60 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
25a70 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
25a80 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
25a90 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
25aa0 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
25ab0 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
25ac0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
25ad0 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
25ae0 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
25af0 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
25b00 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
25b10 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
25b20 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
25b30 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
25b40 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
25b50 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
25b60 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
25b70 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
25b80 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
25b90 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
25ba0 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
25bb0 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
25bc0 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
25bd0 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
25be0 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
25bf0 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
25c00 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
25c10 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20      int nCell = 
25c20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
25c30 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
25c40 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
25c50 6f 61 64 0a 20 20 20 20 20 20 20 20 20 2f 2a 20  oad.         /* 
25c60 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 29  && (pCell+nCell)
25c70 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  <pPage->aDataEnd
25c80 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
25c90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
25ca0 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20   branch runs if 
25cb0 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20  the record-size 
25cc0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c  field of the cel
25cd0 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20  l is a.         
25ce0 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20   ** single byte 
25cf0 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
25d00 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72  ecord fits entir
25d10 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a  ely on the main.
25d20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74            ** b-t
25d30 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
25d40 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25d50 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d  ( pCell+nCell+1=
25d60 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
25d70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20   );.          c 
25d80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
25d90 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
25da0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
25db0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
25dc0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
25dd0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
25de0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
25df0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
25e00 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
25e10 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
25e20 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
25e30 20 20 20 2f 2a 20 26 26 20 28 70 43 65 6c 6c 2b     /* && (pCell+
25e40 6e 43 65 6c 6c 2b 32 29 3c 3d 70 50 61 67 65 2d  nCell+2)<=pPage-
25e50 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20 20 20  >aDataEnd */.   
25e60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25e70 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
25e80 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
25e90 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
25ea0 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
25eb0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
25ec0 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
25ed0 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
25ee0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
25ef0 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
25f00 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
25f10 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
25f20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
25f30 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
25f40 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
25f50 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
25f60 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
25f70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
25f80 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
25f90 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
25fa0 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
25fb0 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
25fc0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
25fd0 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
25fe0 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
25ff0 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
26000 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
26010 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
26020 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
26030 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
26040 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
26050 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
26060 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
26070 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
26080 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a  n be called. */.
26090 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
260a0 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
260b0 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
260c0 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
260d0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
260e0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
260f0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
26100 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
26110 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
26120 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
26130 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
26140 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
26150 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d        pCellKey =
26160 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
26170 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20  nCell );.       
26180 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
26190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
261a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
261b0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
261c0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
261d0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
261e0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
261f0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
26200 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
26210 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
26220 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
26230 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
26240 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26250 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
26260 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
26270 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
26280 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
26290 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
262a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
262b0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
262c0 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
262d0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
262e0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
262f0 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
26300 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26310 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
26320 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
26330 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
26340 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
26350 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
26360 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
26370 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26380 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
26390 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
263a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
263b0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
263c0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
263d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
263e0 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
263f0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
26400 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26410 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
26420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26430 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20  f( lwr>upr ){.  
26440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26450 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
26460 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
26470 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20  ge] = (u16)(idx 
26480 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a  = (lwr+upr)/2);.
26490 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
264a0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
264b0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
264c0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
264d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
264e0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
264f0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
26500 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
26510 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
26520 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
26530 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
26540 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
26550 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
26560 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
26570 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
26580 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
26590 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
265a0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
265b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
265c0 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
265d0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
265e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
265f0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
26600 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
26610 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a 70  Cell );.      *p
26620 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72  Res = c;.      r
26630 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26640 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
26650 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
26660 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
26670 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
26680 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72  16)lwr;.    pCur
26690 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
266a0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
266b0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72  dNKey = 0;.    r
266c0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
266d0 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20  pCur, chldPg);. 
266e0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
266f0 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
26700 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73    }.moveto_finis
26710 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  h:.  return rc;.
26720 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
26730 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
26740 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
26750 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
26760 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
26770 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
26780 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
26790 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
267a0 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
267b0 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
267c0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
267d0 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
267e0 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
267f0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
26800 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
26810 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
26820 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
26830 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
26840 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
26850 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26860 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
26870 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
26880 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
26890 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
268a0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
268b0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
268c0 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
268d0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
268e0 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
268f0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
26900 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
26910 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
26920 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
26930 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
26940 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
26950 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
26960 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
26970 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
26980 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
26990 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
269a0 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
269b0 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
269c0 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
269d0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
269e0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
269f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
26a00 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
26a10 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
26a20 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
26a30 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
26a40 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
26a50 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
26a60 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
26a70 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
26a80 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
26a90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
26aa0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
26ab0 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
26ac0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
26ad0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
26ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26af0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
26b00 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
26b10 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52 53  =0 );.  if( CURS
26b20 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
26b30 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
26b40 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72  *pRes = 1;.    r
26b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26b60 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
26b70 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20  >skipNext>0 ){. 
26b80 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
26b90 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  t = 0;.    *pRes
26ba0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
26bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
26bc0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
26bd0 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d   = 0;..  pPage =
26be0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
26bf0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64  ur->iPage];.  id
26c00 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64  x = ++pCur->aiId
26c10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
26c20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26c30 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a  >isInit );..  /*
26c40 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
26c50 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74   file is corrupt
26c60 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
26c70 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f   for the value o
26c80 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62  f idx .  ** to b
26c90 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20  e invalid here. 
26ca0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63  This can only oc
26cb0 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20  cur if a second 
26cc0 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a  cursor modifies.
26cd0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68    ** the page wh
26ce0 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20  ile cursor pCur 
26cf0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
26d00 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68  erence to it. Wh
26d10 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c  ich can.  ** onl
26d20 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
26d30 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72  database is corr
26d40 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  upt in such a wa
26d50 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  y as to link the
26d60 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20  .  ** page into 
26d70 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d  more than one b-
26d80 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20  tree structure. 
26d90 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69  */.  testcase( i
26da0 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx>pPage->nCell 
26db0 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
26dc0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
26dd0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
26de0 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
26df0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
26e00 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
26e10 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
26e20 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
26e30 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
26e40 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
26e50 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
26e60 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
26e70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
26e80 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
26e90 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
26ea0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
26eb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26ec0 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
26ed0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
26ee0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
26ef0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
26f00 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
26f10 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
26f20 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26f30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
26f40 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
26f50 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
26f60 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
26f70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26f80 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
26f90 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
26fa0 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
26fb0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
26fc0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
26fd0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
26fe0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
26ff0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
27000 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
27010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
27020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27030 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
27040 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20  rc;.  }.  *pRes 
27050 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
27060 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
27070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27080 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54    }.  rc = moveT
27090 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
270a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
270b0 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65  ../*.** Step the
270c0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62   cursor to the b
270d0 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69  ack to the previ
270e0 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ous entry in the
270f0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
27100 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
27110 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
27120 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
27130 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
27140 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72  nting to the fir
27150 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27160 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
27170 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
27180 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
27190 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f   set *pRes=1..*/
271a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
271b0 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
271c0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
271d0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
271e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
271f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
27200 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
27210 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
27220 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
27230 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
27240 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27250 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
27260 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c  .  }.  pCur->atL
27270 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43  ast = 0;.  if( C
27280 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
27290 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
272a0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
272b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
272c0 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
272d0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29  ur->skipNext<0 )
272e0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
272f0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70  Next = 0;.    *p
27300 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
27310 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27320 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e   }.  pCur->skipN
27330 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  ext = 0;..  pPag
27340 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
27350 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
27360 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
27370 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
27380 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
27390 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
273a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
273b0 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
273c0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
273d0 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
273e0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
273f0 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
27400 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
27410 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
27420 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
27430 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
27440 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
27450 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27460 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
27470 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
27480 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
27490 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
274a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
274b0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
274c0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
274d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
274e0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
274f0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
27500 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e    }.    pCur->in
27510 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
27520 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
27530 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72  y = 0;..    pCur
27540 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27550 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67  age]--;.    pPag
27560 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
27570 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
27580 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
27590 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
275a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
275b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
275c0 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52  revious(pCur, pR
275d0 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
275e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
275f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
27600 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72    *pRes = 0;.  r
27610 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
27620 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
27630 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  w page from the 
27640 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
27650 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67  *.** The new pag
27660 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64  e is marked as d
27670 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72  irty.  (In other
27680 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50   words, sqlite3P
27690 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68  agerWrite().** h
276a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
276b0 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65  called on the ne
276c0 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65  w page.)  The ne
276d0 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a  w page has also.
276e0 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63  ** been referenc
276f0 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69  ed and the calli
27700 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  ng routine is re
27710 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
27720 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  lling.** sqlite3
27730 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20  PagerUnref() on 
27740 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65  the new page whe
27750 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a  n it is done..**
27760 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
27770 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
27780 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72  cess.  Any other
27790 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
277a0 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72  dicates.** an er
277b0 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e  ror.  *ppPage an
277c0 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64  d *pPgno are und
277d0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76  efined in the ev
277e0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
277f0 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b  .** Do not invok
27800 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  e sqlite3PagerUn
27810 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65  ref() on *ppPage
27820 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   if an error is 
27830 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
27840 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20  If the "nearby" 
27850 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
27860 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62   0, then a (feeb
27870 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61  le) effort is ma
27880 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
27890 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
278a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
278b0 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
278c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
278d0 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
278e0 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
278f0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
27900 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
27910 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
27920 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
27930 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
27940 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
27950 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78  **.** If the "ex
27960 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69  act" parameter i
27970 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65  s not 0, and the
27980 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61   page-number nea
27990 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61  rby exists .** a
279a0 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
279b0 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
279c0 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  t is guarenteed 
279d0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
279e0 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20  This.** is only 
279f0 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
27a00 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68  uum databases wh
27a10 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  en allocating a 
27a20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  new table..*/.st
27a30 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
27a40 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
27a50 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
27a60 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
27a70 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  , .  Pgno *pPgno
27a80 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  , .  Pgno nearby
27a90 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a  ,.  u8 exact.){.
27aa0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
27ab0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
27ac0 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
27ad0 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
27ae0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
27af0 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
27b00 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
27b10 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
27b20 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
27b30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
27b40 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
27b50 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
27b60 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
27b70 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
27b80 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
27b90 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
27ba0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
27bb0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
27bc0 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
27bd0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
27be0 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
27bf0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
27c00 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
27c10 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
27c20 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6]);.  testcase(
27c30 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a   n==mxPage-1 );.
27c40 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20    if( n>=mxPage 
27c50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27c60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
27c70 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
27c80 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
27c90 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
27ca0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
27cb0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
27cc0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
27cd0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
27ce0 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
27cf0 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
27d00 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
27d10 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
27d20 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
27d30 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
27d40 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
27d50 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
27d60 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
27d70 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
27d80 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
27d90 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
27da0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
27db0 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
27dc0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
27dd0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
27de0 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
27df0 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
27e00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
27e10 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
27e20 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79   exact && nearby
27e30 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
27e40 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
27e50 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
27e60 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
27e70 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
27e80 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
27e90 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
27ea0 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
27eb0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
27ec0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
27ed0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
27ee0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
27ef0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
27f00 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
27f10 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
27f20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
27f30 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
27f40 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
27f50 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
27f60 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
27f70 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
27f80 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
27f90 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
27fa0 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
27fb0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
27fc0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
27fd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
27fe0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
27ff0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
28000 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28010 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
28020 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
28030 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
28040 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
28050 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
28060 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
28070 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
28080 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
28090 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
280a0 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
280b0 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
280c0 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
280d0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
280e0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
280f0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
28100 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
28110 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
28120 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
28130 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
28140 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
28150 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
28160 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
28170 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
28180 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
28190 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
281a0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
281b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
281c0 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d  stcase( iTrunk==
281d0 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
281e0 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67  if( iTrunk>mxPag
281f0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
28200 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
28210 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c  _BKPT;.      }el
28220 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
28230 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
28240 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
28250 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
28260 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
28270 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
28280 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
28290 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
282a0 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
282b0 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
282c0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
282d0 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
282e0 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ta!=0 );..      
282f0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
28300 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
28310 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20   /* # of leaves 
28320 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61  on this trunk pa
28330 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
28340 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c  k==0 && !searchL
28350 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
28360 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20  * The trunk has 
28370 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68  no leaves and th
28380 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65  e list is not be
28390 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20  ing searched. . 
283a0 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74         ** So ext
283b0 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70  ract the trunk p
283c0 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75  age itself and u
283d0 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77  se it as the new
283e0 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ly .        ** a
283f0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
28400 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28410 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29   pPrevTrunk==0 )
28420 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
28430 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
28440 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
28450 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28460 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
28470 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
28480 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
28490 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
284a0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
284b0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
284c0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
284d0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
284e0 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  4);.        *ppP
284f0 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
28500 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
28510 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
28520 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
28530 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
28540 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
28550 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  Pgno, n-1));.   
28560 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28     }else if( k>(
28570 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u32)(pBt->usable
28580 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20  Size/4 - 2) ){. 
28590 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
285a0 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
285b0 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
285c0 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
285d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
285e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
285f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
28600 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
28610 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
28620 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
28630 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
28640 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
28650 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
28660 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
28670 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
28680 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
28690 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
286a0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
286b0 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
286c0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
286d0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
286e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
286f0 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
28700 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
28710 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
28720 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
28730 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
28740 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
28750 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28760 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
28770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28780 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
28790 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
287a0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
287b0 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
287c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
287d0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
287e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
287f0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
28800 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
28810 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
28820 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
28830 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
28840 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28850 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
28860 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28870 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28890 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
288a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
288b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
288c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
288d0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
288e0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
288f0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
28900 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28920 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
28930 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
28940 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
28950 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
28960 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
28970 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
28980 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
28990 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
289a0 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
289b0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
289c0 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
289d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
289e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
289f0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
28a00 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
28a10 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
28a20 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
28a30 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
28a40 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
28a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28a60 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
28a70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
28a80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
28a90 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
28aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28ab0 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77 54   testcase( iNewT
28ac0 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
28ad0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
28ae0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
28af0 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
28b00 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
28b10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28b20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28b30 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
28b40 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
28b50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28b60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28b70 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
28b80 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
28b90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
28ba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
28bc0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
28bd0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
28be0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
28bf0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
28c00 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
28c10 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
28c20 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
28c30 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
28c40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
28c50 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
28c60 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
28c70 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
28c80 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
28c90 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
28ca0 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
28cb0 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
28cc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
28cd0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
28ce0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
28cf0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
28d00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
28d10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28d20 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
28d30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
28d40 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
28d50 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
28d60 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
28d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28d80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28d90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
28da0 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
28db0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28dc0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
28dd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
28de0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
28df0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28e00 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
28e10 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
28e20 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
28e30 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
28e40 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
28e50 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
28e60 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
28e70 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
28e80 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
28e90 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
28ea0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
28eb0 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
28ec0 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
28ed0 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
28ee0 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
28ef0 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
28f00 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
28f10 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
28f20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
28f30 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
28f40 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
28f50 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
28f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
28f70 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2 i;.          i
28f80 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
28f90 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
28fa0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
28fb0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
28fc0 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
28fd0 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
28fe0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
28ff0 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<k; i++){.  
29000 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
29010 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
29020 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
29030 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
29040 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
29050 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
29060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
29070 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
29080 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
29090 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
290a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
290b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
290c0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
290d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
290e0 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
290f0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
29100 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
29110 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
29120 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
29130 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
29140 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
29150 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29160 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29170 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
29180 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
29190 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
291a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
291b0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
291c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
291d0 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
291e0 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
291f0 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
29200 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
29210 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
29220 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
29230 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
29240 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
29250 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
29270 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
29280 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
29290 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
292a0 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
292b0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
292c0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
292d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
292e0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
292f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29300 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
29310 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
29320 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
29330 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
29340 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
29350 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
29360 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
29370 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
29380 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
29390 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
293a0 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
293b0 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
293c0 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
293d0 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
293e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
293f0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
29400 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
29410 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
29420 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29430 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29440 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29450 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
29460 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
29470 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
29480 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
294a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
294b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
294c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
294d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
294e0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
294f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29500 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
29510 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
29520 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
29530 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
29540 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
29550 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
29560 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
29570 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
29580 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
29590 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
295a0 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
295b0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72  he file */.    r
295c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
295d0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
295e0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
295f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29600 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50   rc;.    pBt->nP
29610 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  age++;.    if( p
29620 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
29630 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
29640 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b  ) ) pBt->nPage++
29650 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
29660 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
29670 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
29680 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52  utoVacuum && PTR
29690 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
296a0 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20  pBt->nPage) ){. 
296b0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
296c0 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
296d0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
296e0 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
296f0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
29700 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
29710 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
29720 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
29730 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
29740 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
29750 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
29760 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
29770 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
29780 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
29790 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
297a0 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
297b0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
297c0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
297d0 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
297e0 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70  -map page)\n", p
297f0 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20  Bt->nPage));.   
29800 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
29810 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42  nPage!=PENDING_B
29820 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
29830 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
29840 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 42  eGetPage(pBt, pB
29850 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
29860 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
29870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
29890 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
298a0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
298b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
298c0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
298d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
298e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
298f0 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
29900 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
29910 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
29920 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
29930 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
29940 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
29950 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
29960 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
29970 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
29980 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
29990 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
299a0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
299b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
299c0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
299d0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
299e0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
299f0 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  age, 1);.    if(
29a00 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29a10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
29a20 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
29a30 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
29a40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
29a50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29a60 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
29a70 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
29a80 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
29a90 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
29aa0 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
29ab0 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
29ac0 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
29ad0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
29ae0 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
29af0 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
29b00 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
29b10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
29b20 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28  revTrunk);.  if(
29b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29b40 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
29b50 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
29b60 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
29b70 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
29b80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
29b90 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  pPage);.      re
29ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29bb0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
29bc0 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
29bd0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
29be0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
29bf0 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
29c00 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
29c10 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
29c20 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70  Iswriteable((*pp
29c30 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20  Page)->pDbPage) 
29c40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29c50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
29c60 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
29c70 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
29c80 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
29c90 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
29ca0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
29cb0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
29cc0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
29cd0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
29ce0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
29cf0 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
29d00 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
29d10 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
29d20 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
29d30 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
29d40 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
29d50 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
29d60 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
29d70 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
29d80 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
29d90 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
29da0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
29db0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
29dc0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
29dd0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
29de0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
29df0 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
29e00 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
29e10 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
29e20 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
29e30 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
29e40 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
29e50 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
29e60 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
29e70 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
29e80 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
29e90 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
29ea0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
29eb0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ed0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
29ee0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
29ef0 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f10 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
29f20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
29f30 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
29f40 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
29f50 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
29f60 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
29f70 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
29f80 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
29f90 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
29fa0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
29fb0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
29fc0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
29fd0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2a000 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
2a010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2a030 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2a040 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
2a050 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
2a060 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2a070 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2a080 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61  );.  assert( iPa
2a090 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
2a0a0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
2a0b0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
2a0c0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70  Page );..  if( p
2a0d0 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70  MemPage ){.    p
2a0e0 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b  Page = pMemPage;
2a0f0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
2a100 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50  rRef(pPage->pDbP
2a110 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2a120 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65     pPage = btree
2a130 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20  PageLookup(pBt, 
2a140 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  iPage);.  }..  /
2a150 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
2a160 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20  free page count 
2a170 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72  on pPage1 */.  r
2a180 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2a190 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2a1a0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
2a1b0 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2a1c0 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20  _out;.  nFree = 
2a1d0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2a1e0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
2a1f0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
2a200 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72  ->aData[36], nFr
2a210 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42  ee+1);..  if( pB
2a220 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
2a230 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
2a240 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
2a250 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f   secure_delete o
2a260 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2a270 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c  , then.    ** al
2a280 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
2a290 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
2a2a0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
2a2b0 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ros..    */.    
2a2c0 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28  if( (!pPage && (
2a2d0 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
2a2e0 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
2a2f0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29  pPage, 0))!=0) )
2a300 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20  .     ||        
2a310 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74      ((rc = sqlit
2a320 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2a330 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
2a340 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
2a350 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2a360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
2a370 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
2a380 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
2a390 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  pageSize);.  }..
2a3a0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2a3b0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
2a3c0 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65  to-vacuum, write
2a3d0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
2a3e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a   pointer-map.  *
2a3f0 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  * to indicate th
2a400 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66  at the page is f
2a410 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ree..  */.  if( 
2a420 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2a430 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
2a440 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
2a450 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72  _FREEPAGE, 0, &r
2a460 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  c);.    if( rc )
2a470 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2a480 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ut;.  }..  /* No
2a490 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65  w manipulate the
2a4a0 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65   actual database
2a4b0 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63   free-list struc
2a4c0 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20  ture. There are 
2a4d0 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69  two.  ** possibi
2a4e0 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66  lities. If the f
2a4f0 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72  ree-list is curr
2a500 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20  ently empty, or 
2a510 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a  if the first.  *
2a520 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  * trunk page in 
2a530 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2a540 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73   full, then this
2a550 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
2a560 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65  e a.  ** new fre
2a570 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2a580 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  e. Otherwise, it
2a590 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c   will become a l
2a5a0 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  eaf of the.  ** 
2a5b0 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
2a5c0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
2a5d0 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20  free-list. This 
2a5e0 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69  block tests if i
2a5f0 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62  t.  ** is possib
2a600 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61  le to add the pa
2a610 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65  ge as a new free
2a620 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f  -list leaf..  */
2a630 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20  .  if( nFree!=0 
2a640 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66  ){.    u32 nLeaf
2a650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a660 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62   /* Initial numb
2a670 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73  er of leaf cells
2a680 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a   on trunk page *
2a690 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  /..    iTrunk = 
2a6a0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
2a6b0 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
2a6c0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
2a6d0 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c  age(pBt, iTrunk,
2a6e0 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20   &pTrunk, 0);.  
2a6f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
2a710 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2a720 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66      }..    nLeaf
2a730 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2a740 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a  unk->aData[4]);.
2a750 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
2a760 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29  >usableSize>32 )
2a770 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  ;.    if( nLeaf 
2a780 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  > (u32)pBt->usab
2a790 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
2a7a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a7b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a7c0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
2a7d0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
2a7e0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28     if( nLeaf < (
2a7f0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
2a800 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
2a810 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
2a820 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
2a830 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
2a840 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
2a850 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
2a860 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
2a870 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
2a880 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
2a890 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
2a8a0 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
2a8b0 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
2a8c0 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
2a8d0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
2a8e0 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
2a8f0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2a900 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
2a910 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
2a920 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
2a930 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
2a940 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
2a950 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
2a960 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
2a970 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
2a980 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2a990 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
2a9a0 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
2a9b0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
2a9c0 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
2a9d0 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
2a9e0 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
2a9f0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
2aa00 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
2aa10 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
2aa20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
2aa30 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
2aa40 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  ** we will conti
2aa50 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20  nue to restrict 
2aa60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
2aa70 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53  tries to usableS
2aa80 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20  ize/4 - 8.      
2aa90 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20  ** for now.  At 
2aaa0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
2aab0 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65  e future (once e
2aac0 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72  veryone has upgr
2aad0 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f  aded.      ** to
2aae0 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29   3.6.0 or later)
2aaf0 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69   we should consi
2ab00 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63  der fixing the c
2ab10 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
2ab20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61  .      ** to rea
2ab30 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  d "usableSize/4-
2ab40 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75  2" instead of "u
2ab50 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a  sableSize/4-8"..
2ab60 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2ab70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2ab80 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2ab90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2aba0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2abb0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2abc0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2abd0 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b  ta[4], nLeaf+1);
2abe0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2abf0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2ac00 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61  [8+nLeaf*4], iPa
2ac10 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2ac20 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e   pPage && (pBt->
2ac30 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
2ac40 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30  ECURE_DELETE)==0
2ac50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
2ac60 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
2ac70 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2ac80 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
2ac90 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2aca0 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
2acb0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
2acc0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
2acd0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2ace0 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
2acf0 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
2ad00 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
2ad10 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
2ad20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2ad30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2ad40 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
2ad50 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
2ad60 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
2ad70 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2ad80 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
2ad90 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
2ada0 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
2adb0 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
2adc0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2add0 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
2ade0 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
2adf0 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
2ae00 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
2ae10 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
2ae20 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2ae30 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
2ae40 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
2ae50 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2ae60 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
2ae70 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
2ae80 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2ae90 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
2aea0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
2aeb0 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
2aec0 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
2aed0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2aee0 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
2aef0 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2af00 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
2af10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2af20 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2af30 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
2af40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
2af50 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2af60 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
2af70 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
2af80 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
2af90 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2afa0 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
2afb0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2afc0 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
2afd0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
2afe0 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
2aff0 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
2b000 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2b010 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
2b020 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
2b030 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
2b040 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2b050 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
2b060 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2b070 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2b080 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
2b090 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2b0a0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
2b0b0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
2b0c0 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
2b0d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b0e0 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
2b0f0 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
2b100 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
2b110 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
2b120 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
2b130 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2b140 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
2b150 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
2b160 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
2b170 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2b180 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
2b190 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
2b1a0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2b1b0 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
2b1c0 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
2b1d0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
2b1e0 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
2b1f0 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
2b200 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
2b210 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2b220 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2b230 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
2b240 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2b250 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2b260 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
2b270 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
2b280 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b290 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
2b2a0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
2b2b0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2b2c0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2b2d0 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
2b2e0 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20 70 50  iOverflow+3 > pP
2b2f0 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
2b300 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
2b310 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b320 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20 43 65 6c  CORRUPT;  /* Cel
2b330 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  l extends past e
2b340 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20  nd of page */.  
2b350 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
2b360 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
2b370 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
2b380 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
2b390 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29  usableSize > 4 )
2b3a0 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
2b3b0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2b3c0 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
2b3d0 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
2b3e0 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
2b3f0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
2b400 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
2b410 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
2b420 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
2b430 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
2b440 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e  vfl-- ){.    Pgn
2b450 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  o iNext = 0;.   
2b460 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20   MemPage *pOvfl 
2b470 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66  = 0;.    if( ovf
2b480 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50  lPgno<2 || ovflP
2b490 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
2b4a0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  nt(pBt) ){.     
2b4b0 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c   /* 0 is not a l
2b4c0 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  egal page number
2b4d0 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e   and page 1 cann
2b4e0 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20  ot be an .      
2b4f0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
2b500 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f  . Therefore if o
2b510 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73  vflPgno<2 or pas
2b520 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2b530 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20   .      ** file 
2b540 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
2b550 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
2b560 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2b570 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b580 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
2b590 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   nOvfl ){.      
2b5a0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
2b5b0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
2b5c0 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65  no, &pOvfl, &iNe
2b5d0 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  xt);.      if( r
2b5e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b5f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20     }..    if( ( 
2b600 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c  pOvfl || ((pOvfl
2b610 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
2b620 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  up(pBt, ovflPgno
2b630 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26  ))!=0) ).     &&
2b640 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
2b650 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d  eRefcount(pOvfl-
2b660 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20  >pDbPage)!=1.   
2b670 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2b680 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20  re is no reason 
2b690 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c  any cursor shoul
2b6a0 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61  d have an outsta
2b6b0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20  nding reference 
2b6c0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20  .      ** to an 
2b6d0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65  overflow page be
2b6e0 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c  longing to a cel
2b6f0 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  l that is being 
2b700 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e  deleted/updated.
2b710 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20  .      ** So if 
2b720 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72  there exists mor
2b730 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
2b740 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67  ence to this pag
2b750 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20  e, then it .    
2b760 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65    ** must not re
2b770 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66  ally be an overf
2b780 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65  low page and the
2b790 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
2b7a0 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20  e corrupt. .    
2b7b0 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66    ** It is helpf
2b7c0 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69  ul to detect thi
2b7d0 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  s before calling
2b7e0 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73   freePage2(), as
2b7f0 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50   .      ** freeP
2b800 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20  age2() may zero 
2b810 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
2b820 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65  s if secure-dele
2b830 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20  te mode is.     
2b840 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   ** enabled. If 
2b850 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20  this 'overflow' 
2b860 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
2b870 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74  be a page that t
2b880 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  he.      ** call
2b890 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20  er is iterating 
2b8a0 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67  through or using
2b8b0 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77   in some other w
2b8c0 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a  ay, this.      *
2b8d0 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d  * can be problem
2b8e0 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  atic..      */. 
2b8f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b900 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2b910 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b920 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  rc = freePage2(p
2b930 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50  Bt, pOvfl, ovflP
2b940 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gno);.    }..   
2b950 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20   if( pOvfl ){.  
2b960 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
2b970 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
2b980 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2b990 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2b9a0 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e   rc;.    ovflPgn
2b9b0 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20  o = iNext;.  }. 
2b9c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b9d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
2b9e0 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75  te the byte sequ
2b9f0 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70  ence used to rep
2ba00 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e  resent a cell on
2ba10 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61   page pPage.** a
2ba20 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79  nd write that by
2ba30 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f  te sequence into
2ba40 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66   pCell[].  Overf
2ba50 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  low pages are.**
2ba60 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66   allocated and f
2ba70 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65  illed in as nece
2ba80 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c  ssary.  The call
2ba90 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a  ing procedure.**
2baa0 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
2bab0 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20  for making sure 
2bac0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
2bad0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
2bae0 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c  ted.** for pCell
2baf0 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  []..**.** Note t
2bb00 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e  hat pCell does n
2bb10 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65  ot necessary nee
2bb20 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
2bb30 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  e pPage->aData.*
2bb40 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d  * area.  pCell m
2bb50 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f  ight point to so
2bb60 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f  me temporary sto
2bb70 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20  rage.  The cell 
2bb80 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74  will.** be const
2bb90 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74  ructed in this t
2bba0 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68  emporary area th
2bbb0 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70  en copied into p
2bbc0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c  Page->aData.** l
2bbd0 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ater..*/.static 
2bbe0 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a  int fillInCell(.
2bbf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2bc00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bc10 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
2bc20 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63  t contains the c
2bc30 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
2bc40 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
2bc50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
2bc60 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
2bc70 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cell */.  const 
2bc80 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
2bc90 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
2bca0 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  key */.  const v
2bcb0 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e  oid *pData,int n
2bcc0 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64  Data,   /* The d
2bcd0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ata */.  int nZe
2bce0 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
2bcf0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
2bd00 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61   zero bytes to a
2bd10 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a  ppend to pData *
2bd20 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd40 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
2bd50 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
2bd60 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
2bd70 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
2bd80 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
2bd90 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63  , rc;.  int spac
2bda0 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65  eLeft;.  MemPage
2bdb0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d   *pOvfl = 0;.  M
2bdc0 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61  emPage *pToRelea
2bdd0 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e  se = 0;.  unsign
2bde0 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b  ed char *pPrior;
2bdf0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2be00 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74   *pPayload;.  Bt
2be10 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2be20 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
2be30 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
2be40 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20   int nHeader;.  
2be50 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
2be60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2be70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2be80 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2be90 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
2bea0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
2beb0 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
2bec0 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
2bed0 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
2bee0 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
2bef0 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
2bf00 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
2bf10 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
2bf20 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
2bf30 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
2bf40 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
2bf50 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2bf70 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2bf80 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2bf90 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
2bfa0 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
2bfb0 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
2bfc0 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61   = 0;.  if( !pPa
2bfd0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2bfe0 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20  nHeader += 4;.  
2bff0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68  }.  if( pPage->h
2c000 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48  asData ){.    nH
2c010 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
2c020 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
2c030 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  r], nData+nZero)
2c040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
2c050 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30  Data = nZero = 0
2c060 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20  ;.  }.  nHeader 
2c070 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
2c080 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
2c090 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62  u64*)&nKey);.  b
2c0a0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2c0b0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
2c0c0 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  info);.  assert(
2c0d0 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e   info.nHeader==n
2c0e0 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73 65  Header );.  asse
2c0f0 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
2c100 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2c110 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33   info.nData==(u3
2c120 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20  2)(nData+nZero) 
2c130 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20  );.  .  /* Fill 
2c140 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a  in the payload *
2c150 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  /.  nPayload = n
2c160 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20  Data + nZero;.  
2c170 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2c180 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
2c190 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
2c1a0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
2c1b0 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
2c1c0 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28   .    if( NEVER(
2c1d0 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  nKey>0x7fffffff 
2c1e0 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20  || pKey==0) ){. 
2c1f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c200 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2c210 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
2c220 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79  oad += (int)nKey
2c230 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65  ;.    pSrc = pKe
2c240 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69  y;.    nSrc = (i
2c250 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a  nt)nKey;.  }.  *
2c260 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53  pnSize = info.nS
2c270 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74  ize;.  spaceLeft
2c280 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a   = info.nLocal;.
2c290 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
2c2a0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20  ell[nHeader];.  
2c2b0 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
2c2c0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b  info.iOverflow];
2c2d0 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c  ..  while( nPayl
2c2e0 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  oad>0 ){.    if(
2c2f0 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
2c300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c310 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2c320 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50        Pgno pgnoP
2c330 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c  trmap = pgnoOvfl
2c340 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61  ; /* Overflow pa
2c350 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ge pointer-map e
2c360 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20  ntry page */.   
2c370 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2c380 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
2c390 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
2c3a0 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  pgnoOvfl++;.    
2c3b0 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20      } while( .  
2c3c0 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49          PTRMAP_I
2c3d0 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f  SPAGE(pBt, pgnoO
2c3e0 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c  vfl) || pgnoOvfl
2c3f0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
2c400 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20 20  AGE(pBt) .      
2c410 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e    );.      }.#en
2c420 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61  dif.      rc = a
2c430 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2c440 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70  (pBt, &pOvfl, &p
2c450 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66  gnoOvfl, pgnoOvf
2c460 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  l, 0);.#ifndef S
2c470 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2c480 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49  ACUUM.      /* I
2c490 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
2c4a0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
2c4b0 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63  uum, and the sec
2c4c0 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e  ond or subsequen
2c4d0 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66  t.      ** overf
2c4e0 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65 69 6e  low page is bein
2c4f0 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64  g allocated, add
2c500 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
2c510 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20   pointer-map.   
2c520 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70     ** for that p
2c530 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20  age now. .      
2c540 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74  **.      ** If t
2c550 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
2c560 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
2c570 74 68 65 6e 20 77 72 69 74 65 20 61 20 70 61 72  then write a par
2c580 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20  tial entry .    
2c590 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e    ** to the poin
2c5a0 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77  ter-map. If we w
2c5b0 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20  rite nothing to 
2c5c0 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70  this pointer-map
2c5d0 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20   slot,.      ** 
2c5e0 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73  then the optimis
2c5f0 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  tic overflow cha
2c600 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e  in processing in
2c610 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20   clearCell().   
2c620 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74     ** may misint
2c630 65 72 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69  erpret the unini
2c640 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20  tialised values 
2c650 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20  and delete the. 
2c660 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61       ** wrong pa
2c670 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ges from the dat
2c680 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  abase..      */.
2c690 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
2c6a0 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d  utoVacuum && rc=
2c6b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c6c0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 20 3d        u8 eType =
2c6d0 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52   (pgnoPtrmap?PTR
2c6e0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54  MAP_OVERFLOW2:PT
2c6f0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b  RMAP_OVERFLOW1);
2c700 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50  .        ptrmapP
2c710 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
2c720 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
2c730 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  map, &rc);.     
2c740 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2c750 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2c760 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20  ge(pOvfl);.     
2c770 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
2c780 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
2c790 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2c7a0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
2c7b0 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  se);.        ret
2c7c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2c7d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  .      /* If pTo
2c7e0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
2c7f0 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20  ero than pPrior 
2c800 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20  points into the 
2c810 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 20 20  data area.      
2c820 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
2c830 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
2c840 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
2c850 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
2c860 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
2c870 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
2c880 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2c890 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
2c8a0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2c8b0 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f       /* If pPrio
2c8c0 72 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  r is part of the
2c8d0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
2c8e0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
2c8f0 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 20 20  ure pPage.      
2c900 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
2c910 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  eable */.      a
2c920 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50  ssert( pPrior<pP
2c930 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
2c940 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44  rior>=&pPage->aD
2c950 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
2c960 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
2c970 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2c980 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2c990 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2c9a0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72      put4byte(pPr
2c9b0 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a  ior, pgnoOvfl);.
2c9c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2c9d0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2c9e0 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20       pToRelease 
2c9f0 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70  = pOvfl;.      p
2ca00 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61  Prior = pOvfl->a
2ca10 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34  Data;.      put4
2ca20 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b  byte(pPrior, 0);
2ca30 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20  .      pPayload 
2ca40 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b  = &pOvfl->aData[
2ca50 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c  4];.      spaceL
2ca60 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  eft = pBt->usabl
2ca70 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d  eSize - 4;.    }
2ca80 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61  .    n = nPayloa
2ca90 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61  d;.    if( n>spa
2caa0 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61  ceLeft ) n = spa
2cab0 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20  ceLeft;..    /* 
2cac0 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
2cad0 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
2cae0 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69  Payload points i
2caf0 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65  nto the data are
2cb00 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52  a.    ** of pToR
2cb10 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
2cb20 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
2cb30 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
2cb40 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2cb50 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
2cb60 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2cb70 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
2cb80 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
2cb90 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61  ;..    /* If pPa
2cba0 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66  yload is part of
2cbb0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
2cbc0 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
2cbd0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
2cbe0 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
2cbf0 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61  iteable */.    a
2cc00 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c  ssert( pPayload<
2cc10 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
2cc20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65  pPayload>=&pPage
2cc30 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2cc40 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2cc50 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2cc60 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2cc70 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2cc80 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ..    if( nSrc>0
2cc90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
2cca0 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
2ccb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ccc0 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
2ccd0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
2cce0 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
2ccf0 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
2cd00 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
2cd10 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
2cd20 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
2cd30 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
2cd40 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
2cd50 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
2cd60 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
2cd70 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
2cd80 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
2cd90 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
2cda0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
2cdb0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
2cdc0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2cdd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cde0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f  K;.}../*.** Remo
2cdf0 76 65 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  ve the i-th cell
2ce00 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68   from pPage.  Th
2ce10 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63  is routine effec
2ce20 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a  ts pPage only..*
2ce30 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * The cell conte
2ce40 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20  nt is not freed 
2ce50 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20  or deallocated. 
2ce60 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
2ce70 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20  hat.** the cell 
2ce80 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e  content has been
2ce90 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63   copied someplac
2cea0 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f  e else.  This ro
2ceb0 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65  utine just.** re
2cec0 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65 72 65  moves the refere
2ced0 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  nce to the cell 
2cee0 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  from pPage..**.*
2cef0 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74  * "sz" must be t
2cf00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2cf10 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a  es in the cell..
2cf20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
2cf30 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  ropCell(MemPage 
2cf40 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c  *pPage, int idx,
2cf50 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52   int sz, int *pR
2cf60 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20  C){.  u32 pc;   
2cf70 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2cf80 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
2cf90 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  of cell being de
2cfa0 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64  leted */.  u8 *d
2cfb0 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50  ata;       /* pP
2cfc0 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
2cfd0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
2cfe0 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20  /* Used to move 
2cff0 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74  bytes around wit
2d000 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20  hin data[] */.  
2d010 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20  u8 *endPtr;     
2d020 2f 2a 20 45 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a  /* End of loop *
2d030 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2d040 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
2d050 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2d060 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
2d070 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2d080 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
2d090 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
2d0a0 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
2d0b0 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2d0c0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
2d0d0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
2d0e0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
2d0f0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
2d100 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
2d110 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2d120 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2d130 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2d140 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d150 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2d160 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2d170 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
2d180 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
2d190 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
2d1a0 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
2d1b0 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
2d1c0 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
2d1d0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
2d1e0 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
2d1f0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2d200 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
2d210 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
2d220 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2d230 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
2d240 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
2d250 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
2d260 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
2d270 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
2d280 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
2d290 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2d2a0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
2d2b0 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
2d2c0 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
2d2d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
2d2e0 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
2d2f0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e 64 50  turn;.  }.  endP
2d300 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65  tr = &pPage->aCe
2d310 6c 6c 49 64 78 5b 32 2a 70 50 61 67 65 2d 3e 6e  llIdx[2*pPage->n
2d320 43 65 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61 73 73  Cell - 2];.  ass
2d330 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52  ert( (SQLITE_PTR
2d340 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d  _TO_INT(ptr)&1)=
2d350 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73  =0 );  /* ptr is
2d360 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61   always 2-byte a
2d370 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 77 68 69 6c  ligned */.  whil
2d380 65 28 20 70 74 72 3c 65 6e 64 50 74 72 20 29 7b  e( ptr<endPtr ){
2d390 0a 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20  .    *(u16*)ptr 
2d3a0 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 32 5d  = *(u16*)&ptr[2]
2d3b0 3b 0a 20 20 20 20 70 74 72 20 2b 3d 20 32 3b 0a  ;.    ptr += 2;.
2d3c0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
2d3d0 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65  ll--;.  put2byte
2d3e0 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  (&data[hdr+3], p
2d3f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
2d400 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
2d410 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  2;.}../*.** Inse
2d420 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e  rt a new cell on
2d430 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69   pPage at cell i
2d440 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c  ndex "i".  pCell
2d450 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a   points to the.*
2d460 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * content of the
2d470 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   cell..**.** If 
2d480 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2d490 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2d4a0 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20   page, then put 
2d4b0 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74  it there.  If it
2d4c0 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  .** will not fit
2d4d0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f  , then make a co
2d4e0 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  py of the cell c
2d4f0 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d  ontent into pTem
2d500 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73  p if.** pTemp is
2d510 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61   not null.  Rega
2d520 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c  rdless of pTemp,
2d530 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   allocate a new 
2d540 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67  entry.** in pPag
2d550 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20  e->apOvfl[] and 
2d560 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f  make it point to
2d570 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2d580 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20  t (either.** in 
2d590 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69  pTemp or the ori
2d5a0 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64  ginal pCell) and
2d5b0 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73   also record its
2d5c0 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f   index. .** Allo
2d5d0 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74  cating a new ent
2d5e0 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  ry in pPage->aCe
2d5f0 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61  ll[] implies tha
2d600 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76  t .** pPage->nOv
2d610 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d  erflow is increm
2d620 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ented..**.** If 
2d630 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
2d640 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63  o, then do not c
2d650 6f 70 79 20 74 68 65 20 66 69 72 73 74 20 6e 53  opy the first nS
2d660 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68 65  kip bytes of the
2d670 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61  .** cell. The ca
2d680 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72  ller will overwr
2d690 69 74 65 20 74 68 65 6d 20 61 66 74 65 72 20 74  ite them after t
2d6a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
2d6b0 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69  urns. If.** nSki
2d6c0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
2d6d0 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f  hen pCell may no
2d6e0 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e  t point to an in
2d6f0 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63  valid memory loc
2d700 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70  ation .** (but p
2d710 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c  Cell+nSkip is al
2d720 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a  ways valid)..*/.
2d730 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
2d740 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
2d750 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
2d760 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
2d770 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
2d780 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
2d790 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
2d7a0 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
2d7b0 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
2d7c0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
2d7d0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
2d7e0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
2d7f0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
2d800 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
2d810 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
2d820 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
2d830 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
2d840 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
2d850 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
2d860 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
2d870 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
2d880 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
2d890 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
2d8a0 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
2d8b0 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
2d8c0 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
2d8d0 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
2d8e0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
2d8f0 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
2d900 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
2d910 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
2d920 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
2d930 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
2d940 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
2d950 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2d960 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e  nter */.  int en
2d970 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
2d980 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74  irst byte past t
2d990 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69  he last cell poi
2d9a0 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
2d9b0 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20  /.  int ins;    
2d9c0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
2d9d0 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e  n data[] where n
2d9e0 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  ew cell pointer 
2d9f0 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20  is inserted */. 
2da00 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b   int cellOffset;
2da10 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2da20 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
2da30 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
2da40 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
2da50 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
2da60 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
2da70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
2da80 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  tr;          /* 
2da90 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20  Used for moving 
2daa0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75  information arou
2dab0 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nd in data[] */.
2dac0 20 20 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20    u8 *endPtr;   
2dad0 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68      /* End of th
2dae0 65 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74  e loop */..  int
2daf0 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64   nSkip = (iChild
2db00 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66   ? 4 : 0);..  if
2db10 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
2db20 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
2db30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
2db40 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
2db50 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
2db60 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
2db70 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2db80 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70  Bt) && MX_CELL(p
2db90 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
2dba0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2dbb0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
2dbc0 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
2dbd0 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->apOvfl) );.  a
2dbe0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
2dbf0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d  (pPage->apOvfl)=
2dc00 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
2dc10 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->aiOvfl) );.  a
2dc20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2dc30 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2dc40 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2dc50 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68    /* The cell sh
2dc60 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
2dc70 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79   sized correctly
2dc80 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
2dc90 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d   moving a.  ** m
2dca0 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72  alformed cell fr
2dcb0 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  om a leaf page t
2dcc0 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  o an interior pa
2dcd0 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20  ge, if the cell 
2dce0 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64  size.  ** wanted
2dcf0 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
2dd00 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64   4 but got round
2dd10 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68  ed up to 4 on th
2dd20 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a  e leaf, then siz
2dd30 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  e.  ** might be 
2dd40 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61  less than 8 (lea
2dd50 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72  f-size + pointer
2dd60 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f  ) on the interio
2dd70 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20  r node.  Hence. 
2dd80 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74   ** the term aft
2dd90 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65  er the || in the
2dda0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
2ddb0 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  t(). */.  assert
2ddc0 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
2ddd0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
2dde0 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68  || (sz==8 && iCh
2ddf0 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20  ild>0) );.  if( 
2de00 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2de10 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e   || sz+2>pPage->
2de20 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28  nFree ){.    if(
2de30 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20   pTemp ){.      
2de40 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b  memcpy(pTemp+nSk
2de50 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c  ip, pCell+nSkip,
2de60 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20   sz-nSkip);.    
2de70 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
2de80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2de90 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
2dea0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
2deb0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
2dec0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
2ded0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73  erflow++;.    as
2dee0 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69  sert( j<(int)(si
2def0 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76  zeof(pPage->apOv
2df00 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65  fl)/sizeof(pPage
2df10 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29 3b  ->apOvfl[0])) );
2df20 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f 76  .    pPage->apOv
2df30 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a 20  fl[j] = pCell;. 
2df40 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c     pPage->aiOvfl
2df50 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  [j] = (u16)i;.  
2df60 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
2df70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2df80 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2df90 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2dfa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2dfb0 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
2dfc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
2dfd0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2dfe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2dff0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2e000 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2e010 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2e020 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  ata;.    cellOff
2e030 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
2e040 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
2e050 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
2e060 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
2e070 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
2e080 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
2e090 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
2e0a0 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
2e0b0 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
2e0c0 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
2e0d0 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
2e0e0 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
2e0f0 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
2e100 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
2e110 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69  ing two properti
2e120 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20  es.    ** if it 
2e130 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20  returns success 
2e140 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
2e150 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20  dx >= end+2 );. 
2e160 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
2e170 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
2e180 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2e190 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
2e1a0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
2e1b0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
2e1c0 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
2e1d0 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
2e1e0 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
2e1f0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2e200 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
2e210 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2e220 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68  (&data[idx], iCh
2e230 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2e240 70 74 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d  ptr = &data[end]
2e250 3b 0a 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26  ;.    endPtr = &
2e260 64 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61  data[ins];.    a
2e270 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50  ssert( (SQLITE_P
2e280 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31  TR_TO_INT(ptr)&1
2e290 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20  )==0 );  /* ptr 
2e2a0 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65  is always 2-byte
2e2b0 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20   aligned */.    
2e2c0 77 68 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74  while( ptr>endPt
2e2d0 72 20 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36  r ){.      *(u16
2e2e0 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26  *)ptr = *(u16*)&
2e2f0 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
2e300 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  tr -= 2;.    }. 
2e310 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
2e320 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
2e330 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2e340 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2e350 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
2e360 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
2e370 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2e380 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2e390 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
2e3a0 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
2e3b0 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
2e3c0 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
2e3d0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2e3e0 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
2e3f0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2e400 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
2e410 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
2e420 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
2e430 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
2e440 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
2e450 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
2e460 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2e470 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2e480 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
2e490 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
2e4a0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
2e4b0 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
2e4c0 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
2e4d0 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
2e4e0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
2e4f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2e500 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
2e510 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2e520 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
2e530 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
2e540 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
2e550 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
2e560 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
2e570 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
2e580 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2e590 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
2e5a0 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
2e5b0 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69  es */.  u16 *aSi
2e5c0 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
2e5d0 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
2e5e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
2e5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2e600 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
2e610 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20  8 *pCellptr;    
2e620 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2e630 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
2e640 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
2e650 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
2e660 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
2e670 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63  body */.  u8 * c
2e680 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
2e690 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  e->aData;       
2e6a0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2e6b0 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61   to data for pPa
2e6c0 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2e6d0 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
2e6e0 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
2e6f0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2e700 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65   header on pPage
2e710 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2e720 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d  nUsable = pPage-
2e730 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2e740 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65  ; /* Usable size
2e750 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61   of page */..  a
2e760 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2e770 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
2e780 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2e790 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2e7a0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2e7b0 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
2e7c0 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69  >=0 && nCell<=(i
2e7d0 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  nt)MX_CELL(pPage
2e7e0 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20  ->pBt).         
2e7f0 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45     && (int)MX_CE
2e800 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2e810 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74  10921);.  assert
2e820 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2e830 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2e840 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2e850 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2e860 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
2e870 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
2e880 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
2e890 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2e8a0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
2e8b0 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  rt( get2byteNotZ
2e8c0 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
2e8d0 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20  )==nUsable );.. 
2e8e0 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61   pCellptr = &pPa
2e8f0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65  ge->aCellIdx[nCe
2e900 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64  ll*2];.  cellbod
2e910 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66  y = nUsable;.  f
2e920 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e  or(i=nCell-1; i>
2e930 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31  =0; i--){.    u1
2e940 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b  6 sz = aSize[i];
2e950 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d  .    pCellptr -=
2e960 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79   2;.    cellbody
2e970 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32   -= sz;.    put2
2e980 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63  byte(pCellptr, c
2e990 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65  ellbody);.    me
2e9a0 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62  mcpy(&data[cellb
2e9b0 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c  ody], apCell[i],
2e9c0 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32   sz);.  }.  put2
2e9d0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
2e9e0 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74  ], nCell);.  put
2e9f0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2ea00 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  5], cellbody);. 
2ea10 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d   pPage->nFree -=
2ea20 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61   (nCell*2 + nUsa
2ea30 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b  ble - cellbody);
2ea40 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
2ea50 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a  = (u16)nCell;.}.
2ea60 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2ea70 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  wing parameters 
2ea80 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61  determine how ma
2ea90 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65  ny adjacent page
2eaa0 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a  s get involved.*
2eab0 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67  * in a balancing
2eac0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20   operation.  NN 
2ead0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2eae0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2eaf0 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20  ther side.** of 
2eb00 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61  the page that pa
2eb10 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
2eb20 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61   balancing opera
2eb30 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65  tion.  NB is the
2eb40 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  .** total number
2eb50 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70   of pages that p
2eb60 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c  articipate, incl
2eb70 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74  uding the target
2eb80 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20   page and.** NN 
2eb90 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2eba0 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20  her side..**.** 
2ebb0 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75  The minimum valu
2ebc0 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66  e of NN is 1 (of
2ebd0 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65   course).  Incre
2ebe0 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31  asing NN above 1
2ebf0 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20  .** (to 2 or 3) 
2ec00 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69  gives a modest i
2ec10 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45  mprovement in SE
2ec20 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20  LECT and DELETE 
2ec30 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69  performance.** i
2ec40 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61  n exchange for a
2ec50 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74   larger degradat
2ec60 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e  ion in INSERT an
2ec70 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d  d UPDATE perform
2ec80 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c  ance..** The val
2ec90 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73  ue of NN appears
2eca0 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73   to give the bes
2ecb0 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c  t results overal
2ecc0 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e  l..*/.#define NN
2ecd0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f   1             /
2ece0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  * Number of neig
2ecf0 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2ed00 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f  side of pPage */
2ed10 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a  .#define NB (NN*
2ed20 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74  2+1)      /* Tot
2ed30 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65  al pages involve
2ed40 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65  d in the balance
2ed50 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
2ed60 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2ed70 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69  ALANCE./*.** Thi
2ed80 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c  s version of bal
2ed90 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74  ance() handles t
2eda0 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61  he common specia
2edb0 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20  l case where.** 
2edc0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62  a new entry is b
2edd0 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e  eing inserted on
2ede0 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
2edf0 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  ht-end of the.**
2ee00 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20   tree, in other 
2ee10 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20  words, when the 
2ee20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  new entry will b
2ee30 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73  ecome the larges
2ee40 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68  t.** entry in th
2ee50 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e  e tree..**.** In
2ee60 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20  stead of trying 
2ee70 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33  to balance the 3
2ee80 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2ee90 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64   pages, just add
2eea0 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74  .** a new page t
2eeb0 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  o the right-hand
2eec0 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68   side and put th
2eed0 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20  e one new entry 
2eee0 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e  in.** that page.
2eef0 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68    This leaves th
2ef00 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20  e right side of 
2ef10 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61  the tree somewha
2ef20 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e  t.** unbalanced.
2ef30 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74    But odds are t
2ef40 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69  hat we will be i
2ef50 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74  nserting new ent
2ef60 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65  ries.** at the e
2ef70 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72  nd soon afterwar
2ef80 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79  ds so the nearly
2ef90 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c   empty page will
2efa0 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c   quickly.** fill
2efb0 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65   up.  On average
2efc0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73  ..**.** pPage is
2efd0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77   the leaf page w
2efe0 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68  hich is the righ
2eff0 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74  t-most page in t
2f000 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72  he tree..** pPar
2f010 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e  ent is its paren
2f020 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68  t.  pPage must h
2f030 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65  ave a single ove
2f040 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77  rflow entry.** w
2f050 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65  hich is also the
2f060 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2f070 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  y on the page..*
2f080 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20  *.** The pSpace 
2f090 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74  buffer is used t
2f0a0 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72  o store a tempor
2f0b0 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ary copy of the 
2f0c0 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20  divider.** cell 
2f0d0 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73  that will be ins
2f0e0 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65  erted into pPare
2f0f0 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20  nt. Such a cell 
2f100 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a  consists of a 4.
2f110 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d  ** byte page num
2f120 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ber followed by 
2f130 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2f140 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74  h integer. In ot
2f150 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74  her.** words, at
2f160 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20   most 13 bytes. 
2f170 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65  Hence the pSpace
2f180 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
2f190 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62  at.** least 13 b
2f1a0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
2f1b0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2f1c0 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
2f1d0 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50  e *pParent, MemP
2f1e0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
2f1f0 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61  pSpace){.  BtSha
2f200 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d  red *const pBt =
2f210 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20   pPage->pBt;    
2f220 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61  /* B-Tree Databa
2f230 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  se */.  MemPage 
2f240 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f260 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  Newly allocated 
2f270 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  page */.  int rc
2f280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f2a0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
2f2b0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b  .  Pgno pgnoNew;
2f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2d0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
2f2e0 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a  number of pNew *
2f2f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
2f300 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2f310 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2f320 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2f330 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2f340 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2f350 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2f360 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2f370 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20  verflow==1 );.. 
2f380 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63   /* This error c
2f390 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20  ondition is now 
2f3a0 63 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20  caught prior to 
2f3b0 72 65 61 63 68 69 6e 67 20 74 68 69 73 20 66 75  reaching this fu
2f3c0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20  nction */.  if( 
2f3d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20  pPage->nCell<=0 
2f3e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2f3f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20  CORRUPT_BKPT;.. 
2f400 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e   /* Allocate a n
2f410 65 77 20 70 61 67 65 2e 20 54 68 69 73 20 70 61  ew page. This pa
2f420 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ge will become t
2f430 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  he right-sibling
2f440 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e   of .  ** pPage.
2f450 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74   Make the parent
2f460 20 70 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20   page writable, 
2f470 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  so that the new 
2f480 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a  divider cell.  *
2f490 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65  * may be inserte
2f4a0 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65 73 65  d. If both these
2f4b0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20   operations are 
2f4c0 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63  successful, proc
2f4d0 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eed..  */.  rc =
2f4e0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2f4f0 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
2f500 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  pgnoNew, 0, 0);.
2f510 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2f520 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20  E_OK ){..    u8 
2f530 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b  *pOut = &pSpace[
2f540 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  4];.    u8 *pCel
2f550 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f 76 66  l = pPage->apOvf
2f560 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a  l[0];.    u16 sz
2f570 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
2f580 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2f590 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
2f5a0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
2f5b0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2f5c0 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
2f5d0 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
2f5e0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
2f5f0 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
2f600 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
2f610 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
2f620 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
2f630 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2f640 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
2f650 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
2f660 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
2f670 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20  l, &szCell);..  
2f680 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2f690 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
2f6a0 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
2f6b0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
2f6c0 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
2f6d0 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
2f6e0 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
2f6f0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
2f700 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
2f710 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
2f720 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2f730 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
2f740 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
2f750 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
2f760 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
2f770 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
2f780 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
2f790 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
2f7a0 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
2f7b0 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
2f7c0 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
2f7d0 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
2f7e0 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
2f7f0 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
2f800 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
2f810 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2f820 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
2f830 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
2f840 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
2f850 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
2f860 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
2f870 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
2f880 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
2f890 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2f8a0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
2f8b0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2f8c0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2f8d0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
2f8e0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
2f8f0 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
2f900 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
2f910 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2f920 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
2f930 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2f940 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
2f950 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
2f960 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
2f970 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
2f980 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
2f990 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2f9a0 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
2f9b0 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
2f9c0 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
2f9d0 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
2f9e0 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
2f9f0 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
2fa00 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
2fa10 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
2fa20 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
2fa30 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
2fa40 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
2fa50 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
2fa60 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
2fa70 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
2fa80 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
2fa90 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
2faa0 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
2fab0 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
2fac0 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
2fad0 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
2fae0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2faf0 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
2fb00 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
2fb10 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
2fb20 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
2fb30 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2fb40 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
2fb50 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
2fb60 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
2fb70 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
2fb80 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
2fb90 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
2fba0 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
2fbb0 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
2fbc0 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
2fbd0 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
2fbe0 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
2fbf0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2fc00 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
2fc10 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
2fc20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
2fc30 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2fc40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
2fc50 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
2fc60 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
2fc70 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
2fc80 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2fc90 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
2fca0 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
2fcb0 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
2fcc0 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
2fcd0 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
2fce0 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
2fcf0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
2fd00 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
2fd10 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
2fd20 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
2fd30 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
2fd40 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
2fd50 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
2fd60 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
2fd70 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
2fd80 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
2fd90 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
2fda0 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
2fdb0 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
2fdc0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
2fdd0 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
2fde0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2fdf0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2fe00 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
2fe10 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
2fe20 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
2fe30 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
2fe40 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
2fe50 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
2fe60 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2fe70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2fe80 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
2fe90 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
2fea0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2feb0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
2fec0 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
2fed0 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
2fee0 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
2fef0 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
2ff00 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
2ff10 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
2ff20 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
2ff30 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
2ff40 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
2ff50 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
2ff60 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
2ff70 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
2ff80 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
2ff90 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
2ffa0 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
2ffb0 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
2ffc0 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
2ffd0 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
2ffe0 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
2fff0 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
30000 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
30010 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
30020 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
30030 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
30040 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
30050 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
30060 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
30070 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
30080 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
30090 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
300a0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
300b0 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
300c0 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
300d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
300e0 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
300f0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
30100 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
30110 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
30120 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
30130 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
30140 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
30150 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
30160 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
30170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30180 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
30190 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
301a0 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
301b0 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
301c0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
301d0 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
301e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
301f0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
30200 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
30210 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
30220 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
30230 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
30240 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
30250 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
30260 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
30270 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
30280 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
30290 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
302a0 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
302b0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
302c0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
302d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
302e0 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
302f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
30300 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
30310 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
30320 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
30330 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
30340 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
30350 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
30360 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
30370 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
30380 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
30390 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
303a0 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
303b0 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
303c0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
303d0 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
303e0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
303f0 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
30400 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
30410 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
30420 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
30430 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
30440 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
30450 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
30460 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
30470 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
30480 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
30490 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
304a0 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
304b0 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
304c0 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
304d0 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
304e0 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
304f0 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61  ge.apOvfl[] arra
30500 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
30510 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
30520 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
30530 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
30540 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
30550 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e  ed using btreeIn
30560 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
30570 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
30580 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
30590 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
305a0 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
305b0 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
305c0 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
305d0 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
305e0 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
305f0 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
30600 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
30610 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
30620 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
30630 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
30640 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  d copyNodeConten
30650 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
30660 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20  , MemPage *pTo, 
30670 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
30680 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
30690 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  OK ){.    BtShar
306a0 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
306b0 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20   pFrom->pBt;.   
306c0 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
306d0 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
306e0 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
306f0 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
30700 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  a;.    int const
30710 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
30720 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
30730 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
30740 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
30750 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
30760 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
30770 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20   int iData;.  . 
30780 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46   .    assert( pF
30790 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
307a0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
307b0 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
307c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
307d0 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
307e0 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28  FromHdr+5]) <= (
307f0 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
30800 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
30810 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
30820 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
30830 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
30840 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
30850 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
30860 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
30870 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
30880 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
30890 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
308a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
308b0 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
308c0 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
308d0 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
308e0 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
308f0 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
30900 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
30910 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
30920 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
30930 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
30940 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
30950 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
30960 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
30970 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
30980 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63  on of pTo can ac
30990 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65  tually fail unde
309a0 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20  r.    ** fairly 
309b0 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74  obscure circumst
309c0 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75  ances, even thou
309d0 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20  gh it is a copy 
309e0 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of initialized .
309f0 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f      ** page pFro
30a00 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  m..    */.    pT
30a10 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
30a20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
30a30 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
30a40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30a50 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
30a60 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
30a70 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
30a80 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
30a90 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
30aa0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
30ab0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
30ac0 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
30ad0 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
30ae0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
30af0 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
30b00 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
30b10 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
30b20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
30b30 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
30b40 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
30b50 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
30b60 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
30b70 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
30b80 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
30b90 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
30ba0 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
30bb0 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
30bc0 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
30bd0 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
30be0 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
30bf0 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
30c00 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
30c10 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
30c20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
30c30 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
30c40 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
30c50 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
30c60 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
30c70 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
30c80 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
30c90 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
30ca0 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
30cb0 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
30cc0 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
30cd0 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
30ce0 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
30cf0 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
30d00 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
30d10 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
30d20 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
30d30 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
30d40 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
30d50 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
30d60 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
30d70 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
30d80 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
30d90 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
30da0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
30db0 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
30dc0 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
30dd0 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
30de0 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
30df0 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
30e00 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
30e10 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
30e20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
30e30 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
30e40 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
30e50 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
30e60 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
30e70 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
30e80 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
30e90 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
30ea0 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
30eb0 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
30ec0 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
30ed0 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
30ee0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
30ef0 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
30f00 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
30f10 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
30f20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
30f30 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
30f40 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
30f50 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
30f60 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
30f70 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
30f80 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
30f90 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
30fa0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
30fb0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
30fc0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
30fd0 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
30fe0 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
30ff0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
31000 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
31010 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
31020 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
31030 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
31040 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
31050 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
31060 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
31070 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
31080 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
31090 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
310a0 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
310b0 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
310c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
310d0 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
310e0 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
310f0 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
31100 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
31110 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
31120 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
31130 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
31140 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
31150 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
31160 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
31170 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
31180 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
31190 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
311a0 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
311b0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
311c0 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
311d0 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
311e0 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
311f0 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
31200 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20  ent) the parent 
31210 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
31220 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
31230 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
31240 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
31250 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  t's overflow cel
31260 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73  ls. Because this
31270 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74   function insert
31280 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f  s.** a maximum o
31290 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63  f four divider c
312a0 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
312b0 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74  rent page, and t
312c0 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69  he maximum.** si
312d0 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f  ze of a cell sto
312e0 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e  red within an in
312f0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61  ternal node is a
31300 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20  lways less than 
31310 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  1/4.** of the pa
31320 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76  ge-size, the aOv
31330 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72  flSpace[] buffer
31340 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
31350 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  o be large.** en
31360 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65  ough for all ove
31370 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a  rflow cells..**.
31380 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65  ** If aOvflSpace
31390 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c   is set to a nul
313a0 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  l pointer, this 
313b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
313c0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
313d0 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
313e0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
313f0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
31400 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  rent,           
31410 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
31420 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62  ge of siblings b
31430 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
31440 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64  .  int iParentId
31450 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
31460 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22     /* Index of "
31470 74 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61  the page" in pPa
31480 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f  rent */.  u8 *aO
31490 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20  vflSpace,       
314a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
314b0 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20  e-size bytes of 
314c0 73 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74  space for parent
314d0 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   ovfl */.  int i
314e0 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20  sRoot           
314f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
31500 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73  ue if pParent is
31510 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a   a root-page */.
31520 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
31530 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
31540 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
31550 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
31560 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
31570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
31580 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
31590 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
315a0 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
315b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
315c0 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
315d0 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
315e0 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
315f0 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
31600 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31610 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
31620 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
31630 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
31640 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31650 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
31660 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
31670 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
31680 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
31690 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
316a0 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
316b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
316c0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
316d0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
316e0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
316f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
31700 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
31710 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
31720 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16 leafCorrectio
31730 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
31740 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
31750 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
31760 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
31770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31780 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
31790 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
317a0 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
317b0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
317c0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
317d0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
317e0 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
317f0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
31800 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
31810 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
31820 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
31830 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
31840 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
31850 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
31860 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
31870 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
31880 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
31890 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
318a0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
318b0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
318c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
318d0 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
318e0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
318f0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
31900 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
31910 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
31920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
31930 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
31940 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
31950 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
31960 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
31970 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
31980 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
31990 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
319a0 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
319b0 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
319c0 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
319d0 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
319e0 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
319f0 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ;        /* pPag
31a00 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73  e and up to NB s
31a10 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
31a20 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20  lancing */.  u8 
31a30 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
31a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
31a50 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20  ation in parent 
31a60 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  of right-sibling
31a70 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
31a80 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20   *apDiv[NB-1];  
31a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
31aa0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
31ab0 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
31ac0 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
31ad0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
31ae0 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
31af0 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
31b00 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
31b10 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
31b20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
31b30 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
31b40 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
31b50 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
31b60 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
31b70 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
31b80 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
31b90 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
31ba0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
31bb0 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
31bc0 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
31bd0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
31be0 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31c00 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
31c10 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
31c20 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ls */.  Pgno pgn
31c30 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
31c40 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72       /* Temp var
31c50 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65   to store a page
31c60 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20   number in */.. 
31c70 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
31c80 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
31c90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
31ca0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
31cb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
31cc0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
31cd0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
31ce0 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
31cf0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
31d00 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
31d10 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
31d20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
31d30 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
31d40 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
31d50 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
31d60 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
31d70 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
31d80 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
31d90 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
31da0 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
31db0 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
31dc0 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
31dd0 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
31de0 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
31df0 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
31e00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
31e10 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
31e20 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
31e30 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
31e40 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
31e50 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
31e60 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
31e70 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
31e80 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
31e90 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
31ea0 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
31eb0 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d 69 50 61  ->aiOvfl[0]==iPa
31ec0 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
31ed0 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
31ee0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
31ef0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
31f00 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
31f10 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
31f20 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
31f30 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
31f40 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
31f50 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
31f60 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
31f70 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
31f80 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
31f90 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
31fa0 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
31fb0 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
31fc0 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
31fd0 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
31fe0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
31ff0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
32000 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
32010 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
32020 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
32030 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
32040 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
32050 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
32060 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
32070 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
32080 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
32090 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
320a0 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
320b0 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
320c0 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
320d0 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
320e0 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
320f0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
32100 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
32110 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
32120 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69  nt page, since i
32130 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68  f any existed th
32140 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76  ey will.  ** hav
32150 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
32160 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  emoved..  */.  i
32170 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65   = pParent->nOve
32180 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d  rflow + pParent-
32190 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c  >nCell;.  if( i<
321a0 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  2 ){.    nxDiv =
321b0 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69   0;.    nOld = i
321c0 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  +1;.  }else{.   
321d0 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69   nOld = 3;.    i
321e0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30  f( iParentIdx==0
321f0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
32200 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76      .      nxDiv
32210 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
32220 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
32230 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  i ){.      nxDiv
32240 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73   = i-2;.    }els
32250 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d  e{.      nxDiv =
32260 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20   iParentIdx-1;. 
32270 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a     }.    i = 2;.
32280 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78 44    }.  if( (i+nxD
32290 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
322a0 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d  rflow)==pParent-
322b0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52  >nCell ){.    pR
322c0 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d  ight = &pParent-
322d0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
322e0 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20  hdrOffset+8];.  
322f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68  }else{.    pRigh
32300 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  t = findCell(pPa
32310 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
32320 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
32330 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20  );.  }.  pgno = 
32340 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29  get4byte(pRight)
32350 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
32360 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
32370 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
32380 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  o, &apOld[i]);. 
32390 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
323a0 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c     memset(apOld,
323b0 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66   0, (i+1)*sizeof
323c0 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
323d0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
323e0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
323f0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
32400 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
32410 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
32420 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28  rflow;.    if( (
32430 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  i--)==0 ) break;
32440 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69  ..    if( i+nxDi
32450 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76  v==pParent->aiOv
32460 66 6c 5b 30 5d 20 26 26 20 70 50 61 72 65 6e 74  fl[0] && pParent
32470 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
32480 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
32490 70 50 61 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b  pParent->apOvfl[
324a0 30 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  0];.      pgno =
324b0 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
324c0 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
324d0 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
324e0 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
324f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50 61 72  [i]);.      pPar
32500 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  ent->nOverflow =
32510 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
32520 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
32530 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
32540 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e  , i+nxDiv-pParen
32550 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  t->nOverflow);. 
32560 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
32570 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
32580 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
32590 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
325a0 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
325b0 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f 70 20  ..      /* Drop 
325c0 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68  the cell from th
325d0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 61  e parent page. a
325e0 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f  pDiv[i] still po
325f0 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  ints to.      **
32600 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
32610 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65 76 65   the parent, eve
32620 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61 73 20  n though it has 
32630 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20  been dropped..  
32640 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 73      ** This is s
32650 61 66 65 20 62 65 63 61 75 73 65 20 64 72 6f 70  afe because drop
32660 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79  ping a cell only
32670 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
32680 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
32690 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 74 2c  our bytes of it,
326a0 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
326b0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  on does not need
326c0 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
326d0 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
326e0 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
326f0 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69 6e 74  ll. So the point
32700 65 72 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  er is safe to us
32710 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74 65 72  e.      ** later
32720 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a   on.  .      **.
32730 20 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74        ** But not
32740 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 73 65   if we are in se
32750 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
32760 2e 20 49 6e 20 73 65 63 75 72 65 2d 64 65 6c 65  . In secure-dele
32770 74 65 20 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a  te mode,.      *
32780 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28 29  * the dropCell()
32790 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76   routine will ov
327a0 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74 69  erwrite the enti
327b0 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65 72  re cell with zer
327c0 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e  oes..      ** In
327d0 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d 70   this case, temp
327e0 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68 65  orarily copy the
327f0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61   cell into the a
32800 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20  OvflSpace[].    
32810 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74 20    ** buffer. It 
32820 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20 6f  will be copied o
32830 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e  ut again as soon
32840 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b 5d   as the aSpace[]
32850 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a 2a   buffer.      **
32860 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   is allocated.  
32870 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
32880 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
32890 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
328a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
328b0 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 4f 66  ff;..        iOf
328c0 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  f = SQLITE_PTR_T
328d0 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d 29 20  O_INT(apDiv[i]) 
328e0 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  - SQLITE_PTR_TO_
328f0 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61 44 61  INT(pParent->aDa
32900 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ta);.        if(
32910 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29   (iOff+szNew[i])
32920 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c  >(int)pBt->usabl
32930 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
32940 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
32950 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
32960 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70         memset(ap
32970 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69  Old, 0, (i+1)*si
32980 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b  zeof(MemPage*));
32990 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
329a0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
329b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
329c0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
329d0 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66  (&aOvflSpace[iOf
329e0 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a  f], apDiv[i], sz
329f0 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  New[i]);.       
32a00 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61     apDiv[i] = &a
32a10 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b  OvflSpace[apDiv[
32a20 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  i]-pParent->aDat
32a30 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  a];.        }.  
32a40 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72 6f 70      }.      drop
32a50 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b  Cell(pParent, i+
32a60 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
32a70 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b  Overflow, szNew[
32a80 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  i], &rc);.    }.
32a90 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e    }..  /* Make n
32aa0 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69  MaxCells a multi
32ab0 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65  ple of 4 in orde
32ac0 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d  r to preserve 8-
32ad0 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d  byte.  ** alignm
32ae0 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c  ent */.  nMaxCel
32af0 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20  ls = (nMaxCells 
32b00 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20  + 3)&~3;..  /*. 
32b10 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   ** Allocate spa
32b20 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74  ce for memory st
32b30 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20  ructures.  */.  
32b40 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  k = pBt->pageSiz
32b50 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e + ROUND8(sizeo
32b60 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73  f(MemPage));.  s
32b70 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20  zScratch =.     
32b80 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65    nMaxCells*size
32b90 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20  of(u8*)         
32ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32bb0 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
32bc0 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
32bd0 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20  of(u16)         
32be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32bf0 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   szCell */.     
32c00 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  + pBt->pageSize 
32c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32c30 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20   aSpace1 */.    
32c40 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20   + k*nOld;      
32c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32c70 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61  * Page copies (a
32c80 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65  pCopy) */.  apCe
32c90 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ll = sqlite3Scra
32ca0 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72  tchMalloc( szScr
32cb0 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61  atch ); .  if( a
32cc0 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
32cd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
32ce0 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
32cf0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
32d00 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
32d10 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
32d20 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20  lls];.  aSpace1 
32d30 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
32d40 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
32d50 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
32d60 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65  ALIGNMENT(aSpace
32d70 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  1) );..  /*.  **
32d80 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74   Load pointers t
32d90 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73  o all cells on s
32da0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64  ibling pages and
32db0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
32dc0 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  ls.  ** into the
32dd0 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20   local apCell[] 
32de0 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70  array.  Make cop
32df0 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  ies of the divid
32e00 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
32e10 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
32e20 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d  d from aSpace1[]
32e30 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
32e40 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
32e50 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
32e60 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
32e70 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
32e80 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
32e90 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
32ea0 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
32eb0 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
32ec0 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
32ed0 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
32ee0 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
32ef0 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
32f00 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20   aSpace1[].  In 
32f10 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
32f20 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
32f30 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
32f40 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
32f50 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
32f60 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
32f70 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
32f80 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
32f90 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
32fa0 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
32fb0 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
32fc0 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
32fd0 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
32fe0 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
32ff0 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
33000 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
33010 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
33020 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
33030 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
33040 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
33050 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
33060 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
33070 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72  .  */.  leafCorr
33080 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30  ection = apOld[0
33090 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  ]->leaf*4;.  lea
330a0 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d  fData = apOld[0]
330b0 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
330c0 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
330d0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
330e0 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
330f0 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
33100 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
33110 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
33120 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
33130 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
33140 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
33150 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
33160 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
33170 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
33180 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
33190 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
331a0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
331b0 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
331c0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
331d0 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
331e0 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
331f0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
33200 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
33210 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
33220 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
33230 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
33240 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
33250 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
33260 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
33270 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
33280 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
33290 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
332a0 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
332b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
332c0 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
332d0 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
332e0 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 4f  flow;.    if( pO
332f0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ld->nOverflow>0 
33300 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
33310 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
33320 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
33330 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
33340 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65   );.        apCe
33350 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
33360 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
33370 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  d, j);.        s
33380 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
33390 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
333a0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
333b0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
333c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
333d0 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  lse{.      u8 *a
333e0 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61  Data = pOld->aDa
333f0 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20 6d 61  ta;.      u16 ma
33400 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d  skPage = pOld->m
33410 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20 20 75  askPage;.      u
33420 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  16 cellOffset = 
33430 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  pOld->cellOffset
33440 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
33450 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
33460 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33470 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
33480 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c  );.        apCel
33490 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43  l[nCell] = findC
334a0 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d 61 73  ellv2(aData, mas
334b0 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65  kPage, cellOffse
334c0 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20 20 73  t, j);.        s
334d0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
334e0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
334f0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
33500 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  .        nCell++
33510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
33520 20 20 20 20 20 20 0a 20 20 20 20 69 66 28 20 69        .    if( i
33530 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65 61 66  <nOld-1 && !leaf
33540 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75 31 36  Data){.      u16
33550 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e 65 77   sz = (u16)szNew
33560 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  [i];.      u8 *p
33570 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  Temp;.      asse
33580 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65  rt( nCell<nMaxCe
33590 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73 7a 43  lls );.      szC
335a0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
335b0 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26  .      pTemp = &
335c0 61 53 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d  aSpace1[iSpace1]
335d0 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65 31 20  ;.      iSpace1 
335e0 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
335f0 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61  ert( sz<=pBt->ma
33600 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20  xLocal+23 );.   
33610 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
33620 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  e1 <= (int)pBt->
33630 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
33640 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
33650 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
33660 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
33670 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
33680 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
33690 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
336a0 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
336b0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
336c0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
336d0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
336e0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
336f0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
33700 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
33710 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
33720 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
33730 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
33740 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
33750 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
33760 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
33770 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
33780 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
33790 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
337a0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
337b0 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
337c0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
337d0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
337e0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
337f0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
33800 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
33810 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
33820 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
33830 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
33840 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
33850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
33860 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
33870 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
33880 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
33890 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
338a0 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
338b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
338c0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
338d0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
338e0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
338f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
33900 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
33910 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
33920 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
33930 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
33940 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
33950 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
33960 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
33970 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
33980 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
33990 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
339a0 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
339b0 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
339c0 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
339d0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
339e0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
339f0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
33a00 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
33a10 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
33a20 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
33a30 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
33a40 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
33a50 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
33a60 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
33a70 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
33a80 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
33a90 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
33aa0 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
33ab0 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
33ac0 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
33ad0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
33ae0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
33af0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
33b00 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
33b10 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
33b20 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
33b30 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
33b40 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
33b50 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
33b60 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
33b70 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
33b80 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
33b90 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
33ba0 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
33bb0 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
33bc0 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
33bd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
33be0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
33bf0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
33c00 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
33c10 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
33c20 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
33c30 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
33c40 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
33c50 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
33c60 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
33c70 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
33c80 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
33c90 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
33ca0 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
33cb0 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
33cc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
33cd0 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62  UPT_BKPT; goto b
33ce0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
33cf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
33d00 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
33d10 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
33d20 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
33d30 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
33d40 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
33d50 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
33d60 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
33d70 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
33d80 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
33d90 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
33da0 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
33db0 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
33dc0 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
33dd0 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
33de0 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
33df0 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
33e00 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
33e10 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
33e20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
33e30 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
33e40 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
33e50 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
33e60 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
33e70 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
33e80 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
33e90 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
33ea0 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
33eb0 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
33ec0 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
33ed0 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
33ee0 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
33ef0 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
33f00 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
33f10 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
33f20 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
33f30 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
33f40 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
33f50 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
33f60 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
33f70 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
33f80 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
33f90 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
33fa0 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
33fb0 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
33fc0 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
33fd0 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
33fe0 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
33ff0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
34000 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
34010 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
34020 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
34030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
34040 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
34050 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
34060 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
34070 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
34080 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
34090 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
340a0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
340b0 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
340c0 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
340d0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
340e0 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
340f0 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
34100 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
34110 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
34120 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
34130 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
34140 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
34150 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
34160 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
34170 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
34180 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
34190 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
341a0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
341b0 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
341c0 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
341d0 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
341e0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
341f0 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
34200 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
34210 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
34220 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61   pPage is.  ** a
34230 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
34240 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
34250 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
34260 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
34270 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
34280 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
34290 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
342a0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a  that page..  **.
342b0 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20 54 68    ** UPDATE:  Th
342c0 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
342d0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
342e0 69 6c 79 20 74 72 75 65 20 69 66 20 74 68 65 20  ily true if the 
342f0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69  database.  ** fi
34300 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20  le is corrupt.  
34310 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  The corruption w
34320 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65 64 20  ill be detected 
34330 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c 61 74  and reported lat
34340 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  er.  ** in this 
34350 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74 68 65  procedure so the
34360 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
34370 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77   act upon it now
34380 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  ..  */.#if 0.  a
34390 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
343a0 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
343b0 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
343c0 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
343d0 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41 43 45  .#endif..  TRACE
343e0 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a  (("BALANCE: old:
343f0 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20   %d %d %d  ",.  
34400 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f    apOld[0]->pgno
34410 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
34420 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20   apOld[1]->pgno 
34430 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
34440 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e   ? apOld[2]->pgn
34450 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f  o : 0.  ));..  /
34460 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
34470 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65  k new pages.  Re
34480 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68  use old pages wh
34490 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20  ere possible..  
344a0 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30  */.  if( apOld[0
344b0 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20  ]->pgno<=1 ){.  
344c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
344d0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
344e0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
344f0 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65  anup;.  }.  page
34500 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d  Flags = apOld[0]
34510 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f  ->aData[0];.  fo
34520 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
34530 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
34540 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e  New;.    if( i<n
34550 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65  Old ){.      pNe
34560 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61  w = apNew[i] = a
34570 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pOld[i];.      a
34580 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pOld[i] = 0;.   
34590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
345a0 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e  agerWrite(pNew->
345b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
345c0 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nNew++;.      if
345d0 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
345e0 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
345f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
34600 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20  sert( i>0 );.   
34610 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
34620 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
34630 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e  pNew, &pgno, pgn
34640 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 0);.      if(
34650 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
34660 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
34670 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
34680 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
34690 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
346a0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
346b0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  ntry for the new
346c0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
346d0 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
346e0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
346f0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
34700 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
34710 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
34720 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
34730 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34750 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
34760 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
34770 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34780 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
34790 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
347a0 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
347b0 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
347c0 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
347d0 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
347e0 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c     freePage(apOl
347f0 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  d[i], &rc);.    
34800 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
34810 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
34820 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
34830 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
34840 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
34850 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
34860 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
34870 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
34880 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
34890 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
348a0 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
348b0 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
348c0 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
348d0 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
348e0 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
348f0 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
34900 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
34910 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
34920 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
34930 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
34940 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
34950 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
34960 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
34970 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
34980 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
34990 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
349a0 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
349b0 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
349c0 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
349d0 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
349e0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
349f0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
34a00 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
34a10 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
34a20 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
34a30 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
34a40 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
34a50 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
34a60 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
34a70 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
34a80 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
34a90 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
34aa0 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
34ab0 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
34ac0 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
34ad0 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
34ae0 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d      if( apNew[j]
34af0 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64  ->pgno<(unsigned
34b00 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
34b10 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
34b20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b     minV = apNew[
34b30 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  j]->pgno;.      
34b40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
34b50 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
34b60 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
34b70 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
34b80 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
34b90 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
34ba0 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
34bb0 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
34bc0 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a  }.  TRACE(("new:
34bd0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
34be0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
34bf0 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65  %d)\n",.    apNe
34c00 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65  w[0]->pgno, szNe
34c10 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
34c20 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67  2 ? apNew[1]->pg
34c30 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  no : 0, nNew>=2 
34c40 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
34c50 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70      nNew>=3 ? ap
34c60 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[2]->pgno : 0
34c70 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
34c80 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
34c90 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d  ew>=4 ? apNew[3]
34ca0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
34cb0 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
34cc0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
34cd0 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f  ? apNew[4]->pgno
34ce0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
34cf0 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
34d00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34d10 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
34d20 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
34d30 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79  age) );.  put4by
34d40 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77  te(pRight, apNew
34d50 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
34d60 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
34d70 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
34d80 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
34d90 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
34da0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
34db0 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
34dc0 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
34dd0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
34de0 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
34df0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
34e00 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
34e10 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
34e20 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
34e30 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
34e40 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
34e50 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
34e60 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  lls );.    zeroP
34e70 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
34e80 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  ags);.    assemb
34e90 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
34ea0 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
34eb0 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
34ec0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
34ed0 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
34ee0 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
34ef0 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
34f00 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
34f10 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
34f20 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
34f30 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
34f40 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
34f50 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
34f60 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
34f70 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
34f80 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
34f90 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
34fa0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
34fb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
34fc0 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c  ert( i<nNew-1 ||
34fd0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20   j==nCell );.   
34fe0 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a   if( j<nCell ){.
34ff0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
35000 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
35010 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
35020 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
35030 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
35040 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
35050 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
35060 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
35070 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
35080 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76      pTemp = &aOv
35090 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61  flSpace[iOvflSpa
350a0 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ce];.      if( !
350b0 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
350c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
350d0 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
350e0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  ell, 4);.      }
350f0 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
35100 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
35110 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
35120 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
35130 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
35140 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
35150 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
35160 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
35170 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
35180 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
35190 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
351a0 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
351b0 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
351c0 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
351d0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
351e0 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
351f0 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
35200 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
35210 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
35220 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
35230 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
35240 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  --;.        btre
35250 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
35260 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
35270 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
35280 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
35290 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70        sz = 4 + p
352a0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
352b0 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  4], info.nKey);.
352c0 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
352d0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
352e0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
352f0 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
35300 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
35310 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
35320 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
35330 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
35340 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
35350 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
35360 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
35370 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
35380 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
35390 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
353a0 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
353b0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
353c0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
353d0 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65  see btreeParseCe
353e0 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
353f0 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
35400 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
35410 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
35420 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
35430 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
35440 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
35450 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
35460 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
35470 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
35480 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
35490 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
354a0 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
354b0 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
354c0 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
354d0 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
354e0 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
354f0 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
35500 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
35510 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
35520 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
35530 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
35540 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
35550 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
35560 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
35570 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
35580 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
35590 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
355a0 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
355b0 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
355c0 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
355d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
355e0 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
355f0 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
35600 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
35610 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20  Bt->maxLocal+23 
35620 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
35630 20 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28   iOvflSpace <= (
35640 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  int)pBt->pageSiz
35650 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72  e );.      inser
35660 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
35670 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
35680 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67   pTemp, pNew->pg
35690 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
356a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
356b0 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
356c0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
356d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
356e0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
356f0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
35700 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b  ) );..      j++;
35710 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
35720 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
35730 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
35740 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
35750 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
35760 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
35770 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
35780 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
35790 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
357a0 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
357b0 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
357c0 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
357d0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
357e0 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69  ld, 4);.  }..  i
357f0 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61  f( isRoot && pPa
35800 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  rent->nCell==0 &
35810 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  & pParent->hdrOf
35820 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e  fset<=apNew[0]->
35830 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nFree ){.    /* 
35840 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
35850 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20   the b-tree now 
35860 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
35870 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c  s. The only sibl
35880 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ing.    ** page 
35890 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
358a0 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
358b0 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  . Copy the conte
358c0 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
358d0 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74  * child page int
358e0 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65  o the parent, de
358f0 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65  creasing the ove
35900 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74  rall height of t
35910 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65  he.    ** b-tree
35920 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e   structure by on
35930 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72  e. This is descr
35940 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c  ibed as the "bal
35950 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a  ance-shallower".
35960 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72      ** sub-algor
35970 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63  ithm in some doc
35980 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20  umentation..    
35990 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  **.    ** If thi
359a0 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
359b0 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68  uum database, th
359c0 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f  e call to copyNo
359d0 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20  deContent() .   
359e0 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69   ** sets all poi
359f0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
35a00 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
35a10 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  o database image
35a20 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66   pages .    ** f
35a30 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69  or which the poi
35a40 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77  nter is stored w
35a50 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ithin the conten
35a60 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a  t being copied..
35a70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
35a80 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20  e second assert 
35a90 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
35aa0 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61  hat the child pa
35ab0 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74  ge is defragment
35ac0 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75  ed.    ** (it mu
35ad0 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73  st be, as it was
35ae0 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63   just reconstruc
35af0 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62  ted using assemb
35b00 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a  lePage()). This.
35b10 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74      ** is import
35b20 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e  ant if the paren
35b30 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  t page happens t
35b40 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74  o be page 1 of t
35b50 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
35b60 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20  ** image.  */.  
35b70 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d    assert( nNew==
35b80 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
35b90 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65   apNew[0]->nFree
35ba0 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65   == .        (ge
35bb0 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d  t2byte(&apNew[0]
35bc0 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65  ->aData[5])-apNe
35bd0 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  w[0]->cellOffset
35be0 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c  -apNew[0]->nCell
35bf0 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  *2) .    );.    
35c00 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
35c10 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e  apNew[0], pParen
35c20 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65  t, &rc);.    fre
35c30 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20  ePage(apNew[0], 
35c40 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  &rc);.  }else if
35c50 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
35c60 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65  {.    /* Fix the
35c70 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
35c80 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
35c90 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65   cells that were
35ca0 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e   shifted around.
35cb0 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61   .    ** There a
35cc0 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  re several diffe
35cd0 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f  rent types of po
35ce0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
35cf0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20  s that need to. 
35d00 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
35d10 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74  ith by this rout
35d20 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65  ine. Some of the
35d30 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  se have been set
35d40 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20   already, but.  
35d50 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e    ** many have n
35d60 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot. The followin
35d70 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a  g is a summary:.
35d80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
35d90 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61  1) The entries a
35da0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e  ssociated with n
35db0 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ew sibling pages
35dc0 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20   that were not. 
35dd0 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69     **      sibli
35de0 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75  ngs when this fu
35df0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
35e00 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c  d. These have al
35e10 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20  ready.    **    
35e20 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64    been set. We d
35e30 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72  on't need to wor
35e40 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62  ry about old sib
35e50 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a  lings that were.
35e60 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65      **      move
35e70 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
35e80 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67  st - the freePag
35e90 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b  e() code has tak
35ea0 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20  en care.    **  
35eb0 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20      of those..  
35ec0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29    **.    **   2)
35ed0 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   The pointer-map
35ee0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
35ef0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
35f00 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  st overflow.    
35f10 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20  **      page in 
35f20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  any overflow cha
35f30 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20  ins used by new 
35f40 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54  divider cells. T
35f50 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20  hese .    **    
35f60 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65    have also alre
35f70 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63  ady been taken c
35f80 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e  are of by the in
35f90 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e  sertCell() code.
35fa0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
35fb0 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   3) If the sibli
35fc0 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
35fd0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68   leaves, then th
35fe0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  e child pages of
35ff0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c  .    **      cel
36000 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  ls stored on the
36010 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d   sibling pages m
36020 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
36030 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
36040 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65    **   4) If the
36050 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
36060 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20  re not internal 
36070 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68  intkey nodes, th
36080 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20  en any.    **   
36090 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
360a0 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20  s used by these 
360b0 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74  cells may need t
360c0 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20  o be updated.   
360d0 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e   **      (intern
360e0 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20  al intkey nodes 
360f0 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f  never contain po
36100 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c  inters to overfl
36110 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a  ow pages)..    *
36120 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66  *.    **   5) If
36130 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
36140 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
36150 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e  s, then the poin
36160 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20  ter-map.    **  
36170 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20      entries for 
36180 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
36190 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69  pages of each si
361a0 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20  bling may need. 
361b0 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65     **      to be
361c0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
361d0 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20  .    ** Cases 1 
361e0 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74 20  and 2 are dealt 
361f0 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74  with above by ot
36200 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65  her code. The ne
36210 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
36220 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73  deals with cases
36230 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65   3 and 4 and the
36240 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c   one after that,
36250 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20   case 5. Since. 
36260 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20     ** setting a 
36270 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
36280 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c  y is a relativel
36290 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  y expensive oper
362a0 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20  ation, this.    
362b0 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74  ** code only set
362c0 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  s pointer map en
362d0 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20  tries for child 
362e0 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
362f0 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20  s that have.    
36300 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65  ** actually move
36310 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e  d between pages.
36320 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
36330 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30   *pNew = apNew[0
36340 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ];.    MemPage *
36350 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d  pOld = apCopy[0]
36360 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66  ;.    int nOverf
36370 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
36380 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
36390 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e  NextOld = pOld->
363a0 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f  nCell + nOverflo
363b0 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72  w;.    int iOver
363c0 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f  flow = (nOverflo
363d0 77 20 3f 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c  w ? pOld->aiOvfl
363e0 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  [0] : -1);.    j
363f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
36400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36410 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
36420 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
36430 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
36440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
36460 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
36470 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
36480 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
36490 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
364a0 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
364b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
364c0 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
364d0 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
364e0 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
364f0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
36500 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
36510 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
36520 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
36530 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
36540 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
36550 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
36560 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
36570 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
36580 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
36590 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
365a0 73 65 72 74 28 20 6a 2b 31 20 3c 20 41 72 72 61  sert( j+1 < Arra
365b0 79 53 69 7a 65 28 61 70 43 6f 70 79 29 20 29 3b  ySize(apCopy) );
365c0 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20  .        pOld = 
365d0 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20  apCopy[++j];.   
365e0 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20       iNextOld = 
365f0 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
36600 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f  pOld->nCell + pO
36610 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
36620 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
36630 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
36640 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f          nOverflo
36650 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
36660 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  low;.          i
36670 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21  Overflow = i + !
36680 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
36690 3e 61 69 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20  >aiOvfl[0];.    
366a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73      }.        is
366b0 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44  Divider = !leafD
366c0 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a  ata;  .      }..
366d0 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76        assert(nOv
366e0 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65  erflow>0 || iOve
366f0 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20  rflow<i );.     
36700 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
36710 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f  w<2 || pOld->aiO
36720 76 66 6c 5b 30 5d 3d 3d 70 4f 6c 64 2d 3e 61 69  vfl[0]==pOld->ai
36730 4f 76 66 6c 5b 31 5d 2d 31 29 3b 0a 20 20 20 20  Ovfl[1]-1);.    
36740 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
36750 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69  ow<3 || pOld->ai
36760 4f 76 66 6c 5b 31 5d 3d 3d 70 4f 6c 64 2d 3e 61  Ovfl[1]==pOld->a
36770 69 4f 76 66 6c 5b 32 5d 2d 31 29 3b 0a 20 20 20  iOvfl[2]-1);.   
36780 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66     if( i==iOverf
36790 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  low ){.        i
367a0 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20  sDivider = 1;.  
367b0 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76        if( (--nOv
367c0 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20  erflow)>0 ){.   
367d0 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77         iOverflow
367e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
367f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
36800 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b   i==cntNew[k] ){
36810 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c  .        /* Cell
36820 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69   i is the cell i
36830 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
36840 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65  wing the last ce
36850 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20  ll on new.      
36860 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67    ** sibling pag
36870 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c  e k. If the sibl
36880 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
36890 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20  f pages of an.  
368a0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20        ** intkey 
368b0 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c  b-tree, then cel
368c0 6c 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72  l i is a divider
368d0 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20   cell.  */.     
368e0 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
368f0 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  ++k];.        if
36900 28 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f  ( !leafData ) co
36910 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
36920 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
36930 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73  nOld );.      as
36940 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a  sert( k<nNew );.
36950 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
36960 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e   cell was origin
36970 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c  ally divider cel
36980 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f  l (and is not no
36990 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61  w) or.      ** a
369a0 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c  n overflow cell,
369b0 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20   or if the cell 
369c0 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61  was located on a
369d0 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69   different sibli
369e0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  ng.      ** page
369f0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61   before the bala
36a00 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  ncing, then the 
36a10 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
36a20 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20  ies associated. 
36a30 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79       ** with any
36a40 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c   child or overfl
36a50 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ow pages need to
36a60 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f   be updated.  */
36a70 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76  .      if( isDiv
36a80 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67  ider || pOld->pg
36a90 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29  no!=pNew->pgno )
36aa0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c  {.        if( !l
36ab0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b  eafCorrection ){
36ac0 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61  .          ptrma
36ad0 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
36ae0 74 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50  te(apCell[i]), P
36af0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
36b00 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  w->pgno, &rc);. 
36b10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36b20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70   if( szCell[i]>p
36b30 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b  New->minLocal ){
36b40 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61  .          ptrma
36b50 70 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77  pPutOvflPtr(pNew
36b60 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63  , apCell[i], &rc
36b70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
36b80 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
36b90 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74  if( !leafCorrect
36ba0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ion ){.      for
36bb0 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
36bc0 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20  +){.        u32 
36bd0 6b 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26  key = get4byte(&
36be0 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b  apNew[i]->aData[
36bf0 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  8]);.        ptr
36c00 6d 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c  mapPut(pBt, key,
36c10 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61   PTRMAP_BTREE, a
36c20 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26  pNew[i]->pgno, &
36c30 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
36c40 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a   }..#if 0.    /*
36c50 20 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b   The ptrmapCheck
36c60 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73  Pages() contains
36c70 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
36c80 65 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79  ents that verify
36c90 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c   that.    ** all
36ca0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
36cb0 65 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65  es are set corre
36cc0 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65  ctly. This is he
36cd0 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20  lpful while .   
36ce0 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54   ** debugging. T
36cf0 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64  his is usually d
36d00 69 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20  isabled because 
36d10 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
36d20 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61  se may.    ** ca
36d30 75 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20  use an assert() 
36d40 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69  statement to fai
36d50 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61  l.  */.    ptrma
36d60 70 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65  pCheckPages(apNe
36d70 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74  w, nNew);.    pt
36d80 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26  rmapCheckPages(&
36d90 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e  pParent, 1);.#en
36da0 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  dif.  }..  asser
36db0 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e  t( pParent->isIn
36dc0 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22  it );.  TRACE(("
36dd0 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
36de0 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64  d: old=%d new=%d
36df0 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20   cells=%d\n",.  
36e00 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e          nOld, nN
36e10 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20  ew, nCell));..  
36e20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
36e30 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
36e40 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
36e50 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
36e60 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43  3ScratchFree(apC
36e70 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ell);.  for(i=0;
36e80 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
36e90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
36ea0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pOld[i]);.  }.  
36eb0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
36ec0 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
36ed0 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29  sePage(apNew[i])
36ee0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
36ef0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
36f00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
36f10 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72  alled when the r
36f20 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
36f30 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69  tree structure i
36f40 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68  s.** overfull (h
36f50 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  as one or more o
36f60 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a  verflow pages)..
36f70 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c  **.** A new chil
36f80 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61  d page is alloca
36f90 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74  ted and the cont
36fa0 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72  ents of the curr
36fb0 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ent root.** page
36fc0 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72  , including over
36fd0 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20  flow cells, are 
36fe0 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
36ff0 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a  child. The root.
37000 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  ** page is then 
37010 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d  overwritten to m
37020 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20  ake it an empty 
37030 70 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69  page with the ri
37040 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f  ght-child .** po
37050 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74  inter pointing t
37060 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a  o the new page..
37070 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
37080 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e  urning, all poin
37090 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
370a0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
370b0 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20   pages .** that 
370c0 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61  the new child-pa
370d0 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  ge now contains 
370e0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20  pointers to are 
370f0 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20  updated. The.** 
37100 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64  entry correspond
37110 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72  ing to the new r
37120 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
37130 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a  er of the root.*
37140 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75  * page is also u
37150 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  pdated..**.** If
37160 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70   successful, *pp
37170 43 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20  Child is set to 
37180 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65  contain a refere
37190 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64  nce to the child
371a0 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51   .** page and SQ
371b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
371c0 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
371d0 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  e the caller is 
371e0 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63  required.** to c
371f0 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
37200 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78  ) on *ppChild ex
37210 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61  actly once. If a
37220 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a  n error occurs,.
37230 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
37240 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
37250 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
37260 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63   to 0..*/.static
37270 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
37280 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f  per(MemPage *pRo
37290 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  ot, MemPage **pp
372a0 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63  Child){.  int rc
372b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
372c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
372d0 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75  rn value from su
372e0 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
372f0 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
37300 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
37310 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
37320 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
37330 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
37340 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
37350 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37360 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69  r of the new chi
37370 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53  ld page */.  BtS
37380 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f  hared *pBt = pRo
37390 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54  ot->pBt;    /* T
373a0 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61  he BTree */..  a
373b0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f  ssert( pRoot->nO
373c0 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61  verflow>0 );.  a
373d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
373e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
373f0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d  utex) );..  /* M
37400 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72  ake pRoot, the r
37410 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
37420 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65  b-tree, writable
37430 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  . Allocate a new
37440 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74   .  ** page that
37450 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
37460 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64   new right-child
37470 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20   of pPage. Copy 
37480 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a  the contents.  *
37490 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74  * of the node st
374a0 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e  ored on pRoot in
374b0 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  to the new child
374c0 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63   page..  */.  rc
374d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
374e0 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  rite(pRoot->pDbP
374f0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
37500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37510 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
37520 72 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68  reePage(pBt,&pCh
37530 69 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70  ild,&pgnoChild,p
37540 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20  Root->pgno,0);. 
37550 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65     copyNodeConte
37560 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64  nt(pRoot, pChild
37570 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
37580 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
37590 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
375a0 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
375b0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52  PTRMAP_BTREE, pR
375c0 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  oot->pgno, &rc);
375d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
375e0 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68   rc ){.    *ppCh
375f0 69 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ild = 0;.    rel
37600 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29  easePage(pChild)
37610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
37620 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
37630 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
37640 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70  teable(pChild->p
37650 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
37660 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
37670 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f  rIswriteable(pRo
37680 6f 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ot->pDbPage) );.
37690 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64    assert( pChild
376a0 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e  ->nCell==pRoot->
376b0 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43  nCell );..  TRAC
376c0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70  E(("BALANCE: cop
376d0 79 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25  y root %d into %
376e0 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  d\n", pRoot->pgn
376f0 6f 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  o, pChild->pgno)
37700 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68  );..  /* Copy th
37710 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  e overflow cells
37720 20 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70   from pRoot to p
37730 43 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70  Child */.  memcp
37740 79 28 70 43 68 69 6c 64 2d 3e 61 69 4f 76 66 6c  y(pChild->aiOvfl
37750 2c 20 70 52 6f 6f 74 2d 3e 61 69 4f 76 66 6c 2c  , pRoot->aiOvfl,
37760 0a 20 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d  .         pRoot-
37770 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f  >nOverflow*sizeo
37780 66 28 70 52 6f 6f 74 2d 3e 61 69 4f 76 66 6c 5b  f(pRoot->aiOvfl[
37790 30 5d 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  0]));.  memcpy(p
377a0 43 68 69 6c 64 2d 3e 61 70 4f 76 66 6c 2c 20 70  Child->apOvfl, p
377b0 52 6f 6f 74 2d 3e 61 70 4f 76 66 6c 2c 0a 20 20  Root->apOvfl,.  
377c0 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6e 4f         pRoot->nO
377d0 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
377e0 52 6f 6f 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Root->apOvfl[0])
377f0 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  );.  pChild->nOv
37800 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e  erflow = pRoot->
37810 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a  nOverflow;..  /*
37820 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e   Zero the conten
37830 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65  ts of pRoot. The
37840 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64  n install pChild
37850 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   as the right-ch
37860 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61  ild. */.  zeroPa
37870 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64  ge(pRoot, pChild
37880 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54  ->aData[0] & ~PT
37890 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62  F_LEAF);.  put4b
378a0 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
378b0 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
378c0 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64  et+8], pgnoChild
378d0 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d  );..  *ppChild =
378e0 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72   pChild;.  retur
378f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
37900 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74  /*.** The page t
37910 68 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74  hat pCur current
37920 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ly points to has
37930 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66   just been modif
37940 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77  ied in.** some w
37950 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ay. This functio
37960 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66  n figures out if
37970 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69   this modificati
37980 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  on means the.** 
37990 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65  tree needs to be
379a0 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69   balanced, and i
379b0 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61  f so calls the a
379c0 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e  ppropriate balan
379d0 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  cing .** routine
379e0 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  . Balancing rout
379f0 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ines are:.**.** 
37a00 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28    balance_quick(
37a10 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64  ).**   balance_d
37a20 65 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c  eeper().**   bal
37a30 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a  ance_nonroot().*
37a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
37a50 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70  ance(BtCursor *p
37a60 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Cur){.  int rc =
37a70 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f   SQLITE_OK;.  co
37a80 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70  nst int nMin = p
37a90 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  Cur->pBt->usable
37aa0 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20  Size * 2 / 3;.  
37ab0 75 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b  u8 aBalanceQuick
37ac0 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20  Space[13];.  u8 
37ad0 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54  *pFree = 0;..  T
37ae0 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c  ESTONLY( int bal
37af0 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65  ance_quick_calle
37b00 64 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f  d = 0 );.  TESTO
37b10 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
37b20 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d  _deeper_called =
37b30 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20   0 );..  do {.  
37b40 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
37b50 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d  ur->iPage;.    M
37b60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
37b70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
37b80 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50  ge];..    if( iP
37b90 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
37ba0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
37bb0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
37bc0 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
37bd0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69   of the b-tree i
37be0 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74  s overfull. In t
37bf0 68 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68  his case call th
37c00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c  e.        ** bal
37c10 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75  ance_deeper() fu
37c20 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  nction to create
37c30 20 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72   a new child for
37c40 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
37c50 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f         ** and co
37c60 70 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  py the current c
37c70 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
37c80 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20  oot-page to it. 
37c90 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  The.        ** n
37ca0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
37cb0 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c   the do-loop wil
37cc0 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68  l balance the ch
37cd0 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20  ild page..      
37ce0 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73    */ .        as
37cf0 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64  sert( (balance_d
37d00 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d  eeper_called++)=
37d10 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
37d20 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
37d30 72 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e  r(pPage, &pCur->
37d40 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20  apPage[1]);.    
37d50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
37d70 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
37d80 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   1;.          pC
37d90 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
37da0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
37db0 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a  ->aiIdx[1] = 0;.
37dc0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
37dd0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31  ( pCur->apPage[1
37de0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  ]->nOverflow );.
37df0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
37e10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
37e20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
37e30 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
37e40 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
37e50 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62  =nMin ){.      b
37e60 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
37e70 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
37e80 20 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d   const pParent =
37e90 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50   pCur->apPage[iP
37ea0 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e  age-1];.      in
37eb0 74 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70  t const iIdx = p
37ec0 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
37ed0 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  -1];..      rc =
37ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
37ef0 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  te(pParent->pDbP
37f00 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
37f10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
37f20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37f30 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
37f40 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  E.        if( pP
37f50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20  age->hasData.   
37f60 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e        && pPage->
37f70 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20  nOverflow==1.   
37f80 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e        && pPage->
37f90 61 69 4f 76 66 6c 5b 30 5d 3d 3d 70 50 61 67 65  aiOvfl[0]==pPage
37fa0 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
37fb0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
37fc0 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  o!=1.         &&
37fd0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
37fe0 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b  =iIdx.        ){
37ff0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
38000 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ll balance_quick
38010 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  () to create a n
38020 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50  ew sibling of pP
38030 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  age on which.   
38040 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f         ** to sto
38050 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  re the overflow 
38060 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75  cell. balance_qu
38070 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20  ick() inserts a 
38080 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20  new cell.       
38090 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65     ** into pPare
380a0 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
380b0 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72  use pParent over
380c0 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20  flow. If this.  
380d0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
380e0 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74  ns, the next int
380f0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
38100 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
38110 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20  nce pParent .   
38120 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69         ** use ei
38130 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  ther balance_non
38140 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63  root() or balanc
38150 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69  e_deeper(). Unti
38160 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  l this.         
38170 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
38180 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69   overflow cell i
38190 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
381a0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
381b0 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  ce[].          *
381c0 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20  * buffer. .     
381d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
381e0 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65    ** The purpose
381f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
38200 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f  g assert() is to
38210 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79   check that only
38220 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
38230 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62  single call to b
38240 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
38250 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20  s made for each 
38260 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
38270 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
38280 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  on. If this were
38290 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61   not verified, a
382a0 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f   subtle bug invo
382b0 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20  lving reuse.    
382c0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
382d0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
382e0 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b  ce[] might sneak
382f0 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a   in..          *
38300 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
38310 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69  rt( (balance_qui
38320 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  ck_called++)==0 
38330 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
38340 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  = balance_quick(
38350 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20  pParent, pPage, 
38360 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
38370 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ce);.        }el
38380 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
38390 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    {.          /*
383a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63   In this case, c
383b0 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  all balance_nonr
383c0 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72  oot() to redistr
383d0 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20  ibute cells.    
383e0 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
383f0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
38400 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e   2 of its siblin
38410 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e  g pages. This in
38420 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20  volves.         
38430 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   ** modifying th
38440 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
38450 61 72 6