/ Hex Artifact Content
Login

Artifact fea8eaab6b7bf0877e35a44827049226e2c397ec:


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 70 42 74 2d 3e 69 73 45  r!=p && pBt->isE
2210: 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
2220: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
2230: 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
2240: 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
2250: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2260: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
2270: 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
2280: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2290: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
22a0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
22b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e  {.    /* The con
22c0: 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65  dition (pIter->e
22d0: 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20  Lock!=eLock) in 
22e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66  the following if
22f0: 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74  (...) .    ** st
2300: 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69 6d  atement is a sim
2310: 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a  plification of:.
2320: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2330: 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  (eLock==WRITE_LO
2340: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f  CK || pIter->eLo
2350: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a  ck==WRITE_LOCK).
2360: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69      **.    ** si
2370: 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
2380: 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   if eLock==WRITE
2390: 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f  _LOCK, then no o
23a0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  ther connection.
23b0: 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20      ** may hold 
23c0: 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20  a WRITE_LOCK on 
23d0: 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69  any table in thi
23e0: 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68  s file (since th
23f0: 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f  ere can.    ** o
2400: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
2410: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a  writer)..    */.
2420: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2430: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2440: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2450: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2460: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
2470: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2480: 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  || pIter->pBtree
2490: 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  ==p || pIter->eL
24a0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b  ock==READ_LOCK);
24b0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
24c0: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
24d0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
24e0: 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   && pIter->eLock
24f0: 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  !=eLock ){.     
2500: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2510: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2520: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
2530: 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  db);.      if( e
2540: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2550: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2560: 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69  rt( p==pBt->pWri
2570: 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ter );.        p
2580: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
2590: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
25a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
25b0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
25c0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  E;.    }.  }.  r
25d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
25f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2600: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
2610: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2620: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
2630: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
2640: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2650: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
2660: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
2670: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
2680: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
2690: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
26a0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
26b0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
26c0: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
26d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
26e0: 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f  ssumes the follo
26f0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61  wing:.**.**   (a
2700: 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ) The specified 
2710: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69  Btree object p i
2720: 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
2730: 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20   sharable.**    
2740: 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65     database (one
2750: 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72   with the BtShar
2760: 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67  ed.sharable flag
2770: 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a   set), and.**.**
2780: 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20     (b) No other 
2790: 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f  Btree objects ho
27a0: 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63  ld a lock that c
27b0: 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20  onflicts.**     
27c0: 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65    with the reque
27d0: 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20  sted lock (i.e. 
27e0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
27f0: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a  TableLock() has.
2800: 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79  **       already
2810: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64   been called and
2820: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
2830: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  _OK)..**.** SQLI
2840: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2850: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2860: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
2870: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  lly. SQLITE_NOME
2880: 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  M .** is returne
2890: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74  d if a malloc at
28a0: 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a  tempt fails..*/.
28b0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68  static int setSh
28c0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
28d0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
28e0: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
28f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2900: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2910: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
2920: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
2930: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2940: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2950: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2960: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2970: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2980: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
29a0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f  =0 );..  /* A co
29b0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
29c0: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
29d0: 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c  ed flag set will
29e0: 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20   never try to.  
29f0: 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64  ** obtain a read
2a00: 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73  -lock using this
2a10: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f   function. The o
2a20: 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62  nly read-lock ob
2a30: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61  tained.  ** by a
2a40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72   connection in r
2a50: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2a60: 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73  mode is on the s
2a70: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
2a80: 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  ** table, and th
2a90: 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  at lock is obtai
2aa0: 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69  ned in BtreeBegi
2ab0: 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20  nTrans().  */.  
2ac0: 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64  assert( 0==(p->d
2ad0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2ae0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2af0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2b00: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
2b10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
2b20: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2b30: 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65  ed on a sharable
2b40: 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74   b-tree after it
2b50: 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20   .  ** has been 
2b60: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
2b70: 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20  no other b-tree 
2b80: 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74  holds a conflict
2b90: 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  ing lock.  */.  
2ba0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2bb0: 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
2bc0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
2bd0: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2be0: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
2bf0: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
2c00: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
2c10: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
2c20: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
2c30: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
2c40: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2c50: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
2c60: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
2c70: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
2c80: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
2c90: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
2ca0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
2cb0: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
2cc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2cd0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2ce0: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
2cf0: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
2d00: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
2d10: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
2d20: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
2d30: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
2d40: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
2d50: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
2d60: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
2d70: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
2d80: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
2d90: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
2da0: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
2db0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2dc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dd0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2de0: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
2df0: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
2e00: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
2e10: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
2e20: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
2e30: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
2e40: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
2e50: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
2e60: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
2e70: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2e80: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
2e90: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
2ea0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
2eb0: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
2ec0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
2ed0: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
2ee0: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
2ef0: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
2f00: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
2f10: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
2f20: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
2f30: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
2f40: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
2f50: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
2f60: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
2f70: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
2f80: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
2f90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2fa0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2fb0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2fc0: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2fe0: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
2ff0: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3000: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3010: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3020: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3030: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3040: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
3050: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
3060: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
3070: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
3080: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
3090: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
30a0: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
30b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
30c0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
30d0: 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  en the BtShared.
30e0: 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61 62  isPending variab
30f0: 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  le.** may be inc
3100: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3120: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3130: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3140: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3150: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3160: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
3170: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
3180: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
3190: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
31a0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
31b0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
31c0: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
31d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
31e0: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
31f0: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3200: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3210: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3220: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
3230: 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  >isExclusive==0 
3240: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
3250: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
3260: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
3270: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
3280: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3290: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
32a0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
32b0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
32c0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
32d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
32e0: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
32f0: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3300: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3310: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3320: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3330: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
3340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3350: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
3360: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
3370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
3380: 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e  sert( pBt->isPen
3390: 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  ding==0 || pBt->
33a0: 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28  pWriter );.  if(
33b0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
33c0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72   ){.    pBt->pWr
33d0: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
33e0: 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
33f0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   0;.    pBt->isP
3400: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65  ending = 0;.  }e
3410: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
3420: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
3430: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
3440: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
3450: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
3460: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
3470: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3480: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3490: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
34a0: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
34b0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
34c0: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
34d0: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
34e0: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
34f0: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3500: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3510: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
3520: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
3530: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
3540: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73 50    ** set the isP
3550: 65 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20 30  ending flag to 0
3560: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
3570: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  If there is not 
3580: 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74  currently a writ
3590: 65 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72 65  er, then BtShare
35a0: 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73 74  d.isPending must
35b0: 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20  .    ** be zero 
35c0: 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73  already. So this
35d0: 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61   next line is ha
35e0: 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63  rmless in that c
35f0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
3600: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3610: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
3620: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
3630: 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65  hanges all write
3640: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42  -locks held by B
3650: 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64  tree p into read
3660: 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69  -locks..*/.stati
3670: 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65  c void downgrade
3680: 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
3690: 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  bleLocks(Btree *
36a0: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
36b0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
36c0: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
36d0: 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  ==p ){.    BtLoc
36e0: 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  k *pLock;.    pB
36f0: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3700: 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
3710: 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42  sive = 0;.    pB
3720: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30  t->isPending = 0
3730: 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d  ;.    for(pLock=
3740: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
3750: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
3760: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
3770: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  sert( pLock->eLo
3780: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
3790: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
37a0: 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  p );.      pLock
37b0: 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  ->eLock = READ_L
37c0: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  OCK;.    }.  }.}
37d0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
37e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
37f0: 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ACHE */..static 
3800: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
3810: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3820: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  ;  /* Forward re
3830: 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a  ference */../*.*
3840: 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  **** This routin
3850: 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  e is used inside
3860: 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c   of assert() onl
3870: 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72  y ****.**.** Ver
3880: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
3890: 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75  sor holds the mu
38a0: 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61  tex on its BtSha
38b0: 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  red.*/.#ifdef SQ
38c0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
38d0: 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64  c int cursorHold
38e0: 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20  sMutex(BtCursor 
38f0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  *p){.  return sq
3900: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3910: 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b  (p->pBt->mutex);
3920: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
3930: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3940: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49  INCRBLOB./*.** I
3950: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3960: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
3970: 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f   cache for curso
3980: 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a  r pCur, if any..
3990: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
39a0: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
39b0: 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20  wCache(BtCursor 
39c0: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
39d0: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
39e0: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
39f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
3a00: 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70  >aOverflow);.  p
3a10: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
3a20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
3a30: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
3a40: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
3a50: 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72  ache for all cur
3a60: 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  sors opened.** o
3a70: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3a80: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3aa0: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
3ab0: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68  erflowCache(BtSh
3ac0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
3ad0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
3ae0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3af0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3b00: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
3b10: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
3b20: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
3b30: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3b40: 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d  lowCache(p);.  }
3b50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
3b60: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
3b70: 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  d before modifyi
3b80: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
3b90: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f  of a table.** to
3ba0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
3bb0: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
3bc0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
3bd0: 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20  n the.** row or 
3be0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20  one of the rows 
3bf0: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
3c00: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
3c10: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3c20: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
3c30: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
3c40: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
3c50: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
3c60: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
3c70: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
3c80: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
3c90: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
3ca0: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
3cb0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
3cc0: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
3cd0: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
3ce0: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
3cf0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
3d00: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
3d10: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
3d20: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
3d30: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
3d40: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
3d50: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
3d60: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
3d70: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
3d80: 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69   on that specifi
3d90: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
3da0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3db0: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
3dc0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
3dd0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
3de0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3df0: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36  to check */.  i6
3e00: 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20  4 iRow,         
3e10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
3e20: 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  id that might be
3e30: 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69   changing */.  i
3e40: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e50: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3e60: 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62  f all rows are b
3e70: 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
3e80: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3e90: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
3ea0: 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b  t = pBtree->pBt;
3eb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3ec0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
3ed0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66  x(pBtree) );.  f
3ee0: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3ef0: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3f00: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73  ){.    if( p->is
3f10: 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
3f20: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
3f30: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
3f40: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
3f50: 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
3f60: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
3f70: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
3f80: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
3f90: 6e 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  ns when INCRBLOB
3fa0: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
3fb0: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
3fc0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3fd0: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3fe0: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
3ff0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
4000: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
4010: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
4020: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a  x,y,z).#endif /*
4030: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4040: 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  RBLOB */../*.** 
4050: 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20  Set bit pgno of 
4060: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4070: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4080: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
4090: 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20  .** when a page 
40a0: 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20  that previously 
40b0: 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62  contained data b
40c0: 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69  ecomes a free-li
40d0: 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65  st leaf .** page
40e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68  ..**.** The BtSh
40f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4100: 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74   bitvec exists t
4110: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e  o work around an
4120: 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20   obscure.** bug 
4130: 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  caused by the in
4140: 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f  teraction of two
4150: 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d   useful IO optim
4160: 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e  izations surroun
4170: 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73  ding.** free-lis
4180: 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a  t leaf pages:.**
4190: 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c  .**   1) When al
41a0: 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65  l data is delete
41b0: 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e  d from a page an
41c0: 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d  d the page becom
41d0: 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65  es.**      a fre
41e0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
41f0: 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  , the page is no
4200: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
4210: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
4220: 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20    (as free-list 
4230: 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61  leaf pages conta
4240: 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c  in no meaningful
4250: 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65   data). Sometime
4260: 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61  s.**      such a
4270: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65   page is not eve
4280: 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73  n journalled (as
4290: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
42a0: 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20  modified,.**    
42b0: 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75    why bother jou
42c0: 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a  rnalling it?)..*
42d0: 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61  *.**   2) When a
42e0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
42f0: 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20  page is reused, 
4300: 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  its content is n
4310: 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ot read.**      
4320: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
4330: 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20  e or written to 
4340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4350: 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a   (why should it.
4360: 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69  **      be, if i
4370: 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  t is not at all 
4380: 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a  meaningful?)..**
4390: 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65  .** By themselve
43a0: 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a  s, these optimiz
43b0: 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65  ations work fine
43c0: 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68   and provide a h
43d0: 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61  andy.** performa
43e0: 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c  nce boost to bul
43f0: 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65  k delete or inse
4400: 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48  rt operations. H
4410: 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20  owever, if.** a 
4420: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f  page is moved to
4430: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
4440: 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77  nd then reused w
4450: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a  ithin the same.*
4460: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  * transaction, a
4470: 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75   problem comes u
4480: 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  p. If the page i
4490: 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64  s not journalled
44a0: 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d   when.** it is m
44b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
44c0: 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20  -list and it is 
44d0: 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  also not journal
44e0: 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69  led when it.** i
44f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4500: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
4510: 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20  nd reused, then 
4520: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
4530: 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74  a.** may be lost
4540: 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  . In the event o
4550: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  f a rollback, it
4560: 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73   may not be poss
4570: 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  ible.** to resto
4580: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
4590: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
45a0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
45b0: 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f  *.** The solutio
45c0: 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65  n is the BtShare
45d0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
45e0: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
45f0: 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76   page is .** mov
4600: 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66  ed to become a f
4610: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4620: 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ge, the correspo
4630: 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20  nding bit is.** 
4640: 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65  set in the bitve
4650: 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65  c. Whenever a le
4660: 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61  af page is extra
4670: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4680: 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69  ee-list,.** opti
4690: 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65  mization 2 above
46a0: 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74   is omitted if t
46b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
46c0: 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a   bit is already.
46d0: 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72  ** set in BtShar
46e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20  ed.pHasContent. 
46f0: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
4700: 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63  the bitvec are c
4710: 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65  leared.** at the
4720: 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72   end of every tr
4730: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
4740: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65  atic int btreeSe
4750: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4760: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4770: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20  pgno){.  int rc 
4780: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
4790: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
47a0: 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65  tent ){.    asse
47b0: 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e  rt( pgno<=pBt->n
47c0: 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d  Page );.    pBt-
47d0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73  >pHasContent = s
47e0: 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
47f0: 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  te(pBt->nPage);.
4800: 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48      if( !pBt->pH
4810: 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  asContent ){.   
4820: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4830: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
4840: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4850: 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c  _OK && pgno<=sql
4860: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4870: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4880: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
4890: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42  ite3BitvecSet(pB
48a0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20  t->pHasContent, 
48b0: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
48c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
48d0: 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61   Query the BtSha
48e0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
48f0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  vector..**.** Th
4900: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4910: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65  alled when a fre
4920: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4930: 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
4940: 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73   the.** free-lis
4950: 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20  t for reuse. It 
4960: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66  returns false if
4970: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72   it is safe to r
4980: 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70  etrieve the.** p
4990: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
49a0: 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
49b0: 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
49c0: 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74  lag set. True ot
49d0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
49e0: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48  ic int btreeGetH
49f0: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4a00: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
4a10: 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70  no){.  Bitvec *p
4a20: 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74   = pBt->pHasCont
4a30: 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ent;.  return (p
4a40: 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65   && (pgno>sqlite
4a50: 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c  3BitvecSize(p) |
4a60: 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
4a70: 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a  est(p, pgno)));.
4a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28  }../*.** Clear (
4a90: 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53  destroy) the BtS
4aa0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4ab0: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73  t bitvec. This s
4ac0: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f  hould be.** invo
4ad0: 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  ked at the concl
4ae0: 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72  usion of each wr
4af0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite-transaction.
4b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4b10: 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
4b20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b30: 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69  Bt){.  sqlite3Bi
4b40: 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d  tvecDestroy(pBt-
4b50: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20  >pHasContent);. 
4b60: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
4b70: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
4b80: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
4b90: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
4ba0: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
4bb0: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
4bc0: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
4bd0: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
4be0: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
4bf0: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
4c00: 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  RESEEK..**.** Th
4c10: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
4c20: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
4c30: 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68  rsor is valid (h
4c40: 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  as eState==CURSO
4c50: 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f  R_VALID).** prio
4c60: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
4c70: 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a  s routine.  .*/.
4c80: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
4c90: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
4ca0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
4cb0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
4cc0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
4cd0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
4ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
4cf0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
4d00: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
4d10: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
4d20: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
4d30: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
4d40: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
4d50: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
4d60: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
4d70: 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  KeySize() cannot
4d80: 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49   fail */..  /* I
4d90: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
4da0: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
4db0: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
4dc0: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
4dd0: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
4de0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
4df0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
4e00: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
4e10: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
4e20: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
4e30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
4e40: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
4e50: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
4e60: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
4e70: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
4e80: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
4e90: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
4ea0: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
4eb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
4ec0: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
4ed0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76  >intKey ){.    v
4ee0: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  oid *pKey = sqli
4ef0: 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
4f00: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
4f10: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
4f20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4f30: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
4f40: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
4f50: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
4f60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4f70: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
4f80: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
4f90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4fb0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
4fc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4fd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4fe0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ff0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5000: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5010: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5020: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5030: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5040: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5050: 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
5060: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
5070: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
5080: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
5090: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
50a0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
50b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
50c0: 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65   -1;.    pCur->e
50d0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
50e0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
50f0: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
5100: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
5110: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5120: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5130: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5140: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5150: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5160: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5170: 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72  he table  with r
5180: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
5190: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
51a0: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
51b0: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
51c0: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
51d0: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
51e0: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
51f0: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5200: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
5210: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
5220: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5230: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
5240: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
5250: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
5260: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5270: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5280: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5290: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
52a0: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
52b0: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
52c0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
52d0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
52e0: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
52f0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
5300: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
5310: 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20  oot) && .       
5320: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
5330: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
5340: 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43    int rc = saveC
5350: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
5360: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
5370: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
5380: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
5390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
53a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
53b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
53c0: 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74  lear the current
53d0: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
53e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
53f0: 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
5400: 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
5410: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
5420: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5430: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
5440: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5450: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  );.  pCur->pKey 
5460: 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  = 0;.  pCur->eSt
5470: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
5480: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ALID;.}../*.** I
5490: 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  n this version o
54a0: 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70  f BtreeMoveto, p
54b0: 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20  Key is a packed 
54c0: 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20  index record.** 
54d0: 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72  such as is gener
54e0: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
54f0: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
5500: 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a  .  Unpack the.**
5510: 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e   record and then
5520: 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74   call BtreeMovet
5530: 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64  oUnpacked() to d
5540: 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73  o the work..*/.s
5550: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d  tatic int btreeM
5560: 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f  oveto(.  BtCurso
5570: 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20  r *pCur,     /* 
5580: 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  Cursor open on t
5590: 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73  he btree to be s
55a0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e  earched */.  con
55b0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
55c0: 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69   /* Packed key i
55d0: 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
55e0: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34  n index */.  i64
55f0: 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
5600: 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20   /* Integer key 
5610: 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a  for tables.  Siz
5620: 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e  e of pKey for in
5630: 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62  dices */.  int b
5640: 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ias,           /
5650: 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f  * Bias search to
5660: 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
5670: 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
5680: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
5690: 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
56a0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
56b0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
56c0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
56d0: 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63   code */.  Unpac
56e0: 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
56f0: 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ey;   /* Unpacke
5700: 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
5710: 20 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30   char aSpace[150
5720: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ];          /* T
5730: 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49  emp space for pI
5740: 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64  dxKey - to avoid
5750: 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20   a malloc */..  
5760: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5770: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
5780: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
5790: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
57a0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
57b0: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
57c0: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
57d0: 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20   pKey,.         
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70               aSp
5800: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
5810: 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ce));.    if( pI
5820: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
5830: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
5850: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
5860: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5870: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
5880: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
5890: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
58a0: 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ;.  if( pKey ){.
58b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
58c0: 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
58d0: 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  ord(pIdxKey);.  
58e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
58f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
5900: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
5910: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
5920: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
5930: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
5940: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
5950: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
5960: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
5970: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
5980: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
5990: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
59a0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
59b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
59c0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
59d0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
59e0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
59f0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5a00: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
5a10: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
5a20: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
5a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5a40: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
5a50: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5a60: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5a70: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5a80: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5a90: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
5aa0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
5ab0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5ac0: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
5ad0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
5ae0: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
5af0: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
5b00: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
5b10: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5b20: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
5b30: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
5b40: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
5b50: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75  r->nKey, 0, &pCu
5b60: 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  r->skipNext);.  
5b70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5b80: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
5b90: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5ba0: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
5bb0: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
5bc0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
5bd0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5be0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5bf0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
5c00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5c10: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5c20: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5c30: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5c40: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5c50: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5c60: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5c70: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5c80: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5c90: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5ca0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5cb0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
5cc0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
5cd0: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
5ce0: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
5cf0: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
5d00: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
5d10: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
5d20: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
5d30: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
5d40: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
5d50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d60: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
5d70: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
5d80: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5d90: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
5da0: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
5db0: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
5dc0: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
5dd0: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
5de0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5df0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
5e00: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
5e10: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
5e20: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
5e30: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
5e40: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
5e50: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
5e60: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e70: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
5e80: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
5e90: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
5ea0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
5eb0: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b  ->skipNext!=0 ){
5ec0: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5ed0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5ee0: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
5ef0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5f00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
5f10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5f20: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
5f30: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
5f40: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
5f50: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
5f60: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
5f70: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
5f80: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
5f90: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
5fa0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
5fb0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
5fc0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
5fd0: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
5fe0: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
5ff0: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
6000: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
6010: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
6020: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
6030: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
6040: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
6050: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
6060: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
6070: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
6080: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
6090: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
60a0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
60b0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
60c0: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
60d0: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
60e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
60f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
6100: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
6110: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
6120: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
6130: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
6140: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
6150: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
6160: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6170: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
6180: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
6190: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
61a0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
61b0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
61c0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
61d0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
61e0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
61f0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
6200: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
6210: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
6220: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
6230: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
6240: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
6250: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
6260: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
6270: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
6280: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
6290: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
62a0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
62b0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
62c0: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
62d0: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
62e0: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
62f0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
6300: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
6310: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
6320: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
6330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
6340: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
6350: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
6360: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
6370: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
6380: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
6390: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
63a0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
63b0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
63c0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
63d0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
63e0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
63f0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
6400: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
6410: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
6420: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
6430: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
6440: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
6450: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6460: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
6470: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
6480: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
6490: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
64a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
64b0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
64c0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
64d0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
64e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
64f0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
6500: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
6510: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
6520: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
6530: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
6540: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
6550: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
6560: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
6570: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
6580: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
65a0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
65b0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
65c0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
65d0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
65e0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
65f0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
6600: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
6610: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6620: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
6630: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
6640: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
6650: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
6660: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
6670: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
6680: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6690: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
66a0: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
66b0: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
66c0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
66d0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
66e0: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
66f0: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6700: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6710: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
6720: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
6730: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
6740: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
6750: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
6760: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
6770: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
6780: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
6790: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
67a0: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
67b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
67c0: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
67d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
67e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
67f0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
6800: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
6810: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6820: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
6830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
6840: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
6850: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6860: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
6870: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
6880: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
6890: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
68a0: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
68b0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
68c0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
68d0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
68e0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
68f0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
6900: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
6910: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
6920: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
6930: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
6940: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
6950: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
6960: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
6970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6980: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
6990: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
69a0: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
69b0: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
69c0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
69d0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
69e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
69f0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
6a00: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
6a10: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
6a20: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
6a30: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
6a40: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
6a50: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6a60: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
6a70: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
6a80: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
6a90: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
6aa0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6ab0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6ac0: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
6ad0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6ae0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6af0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6b00: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6b10: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6b20: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
6b30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
6b40: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6b50: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6b60: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6b70: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
6b80: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
6b90: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
6ba0: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
6bb0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
6bc0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6bd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6be0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6bf0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6c00: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6c10: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6c20: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
6c30: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
6c40: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
6c50: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
6c60: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
6c70: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6c80: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
6c90: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6ca0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
6cb0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
6cc0: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
6cd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6ce0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
6cf0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
6d00: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
6d10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6d20: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
6d30: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
6d40: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
6d50: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
6d60: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6d70: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6d80: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
6d90: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
6da0: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
6db0: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
6dc0: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
6dd0: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
6de0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
6df0: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
6e00: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
6e10: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
6e20: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
6e30: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
6e40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6e50: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
6e60: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
6e70: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
6e80: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
6e90: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
6ea0: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
6eb0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
6ec0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28  Page & get2byte(
6ed0: 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d  &(P)->aData[(P)-
6ee0: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49  >cellOffset+2*(I
6ef0: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
6f00: 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49  ndCellv2(D,M,O,I
6f10: 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65  ) (D+(M&get2byte
6f20: 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a  (D+(O+2*(I))))).
6f30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
6f40: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
6f50: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
6f60: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
6f70: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
6f80: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
6f90: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
6fa0: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
6fb0: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
6fc0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
6fd0: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
6fe0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6ff0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7000: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7010: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
7020: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
7030: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
7040: 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f   k;.    struct _
7050: 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b  OvflCell *pOvfl;
7060: 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50  .    pOvfl = &pP
7070: 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20  age->aOvfl[i];. 
7080: 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64     k = pOvfl->id
7090: 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43  x;.    if( k<=iC
70a0: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
70b0: 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k==iCell ){.   
70c0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66       return pOvf
70d0: 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  l->pCell;.      
70e0: 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b  }.      iCell--;
70f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7100: 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  urn findCell(pPa
7110: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f  ge, iCell);.}../
7120: 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c  *.** Parse a cel
7130: 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20  l content block 
7140: 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  and fill in the 
7150: 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75  CellInfo structu
7160: 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72  re.  There.** ar
7170: 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  e two versions o
7180: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
7190: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
71a0: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
71b0: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
71c0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
71d0: 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43   and btreeParseC
71e0: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
71f0: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
7200: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
7210: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
7220: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
7230: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
7240: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
7250: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
7260: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
7270: 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73   of.** btreePars
7280: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
7290: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
72a0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
72b0: 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aster..*/.static
72c0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
72d0: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
72e0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
72f0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
7300: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
7310: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7330: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
7340: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
7350: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
7360: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
7370: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
7380: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20  */.){.  u16 n;  
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
73b0: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
73c0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
73d0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
73e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
73f0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
7400: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
7410: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7420: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7430: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
7440: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
7450: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
7460: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
7470: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
7480: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
7490: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
74a0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
74b0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
74c0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
74d0: 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
74e0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
74f0: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  .      n += getV
7500: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
7510: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
7520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
7530: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
7540: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
7550: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
7560: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
7570: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
7580: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
7590: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
75a0: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
75b0: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
75c0: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
75d0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
75e0: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
75f0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
7600: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
7610: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
7620: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
7630: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
7640: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
7650: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
7660: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
7670: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
7680: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
7690: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
76a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
76b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
76c0: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
76d0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
76e0: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
76f0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
7700: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
7710: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
7720: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
7730: 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e     if( (pInfo->n
7740: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e  Size = (u16)(n+n
7750: 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49  Payload))<4 ) pI
7760: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
7770: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
7780: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
7790: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
77a0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d  verflow = 0;.  }
77b0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
77c0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
77d0: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
77e0: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
77f0: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
7800: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
7810: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7820: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7830: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
7840: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
7850: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
7860: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
7870: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
7880: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
7890: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
78a0: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
78b0: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
78c0: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
78d0: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
78e0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
78f0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
7900: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
7910: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7920: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7930: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7940: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7950: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7960: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7970: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7980: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
7990: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
79a0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
79b0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
79c0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
79d0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
79e0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
79f0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7a00: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7a10: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7a20: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7a30: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7a40: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7a50: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7a60: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7a70: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7a80: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
7a90: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7aa0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7ab0: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
7ac0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
7ad0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
7ae0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7af0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
7b00: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
7b10: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7b20: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7b30: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7b40: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7b50: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7b60: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7b80: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7b90: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7ba0: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7bb0: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
7bc0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
7bd0: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
7be0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
7bf0: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
7c00: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
7c10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7c20: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
7c30: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7c40: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
7c50: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
7c60: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
7c70: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7c80: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
7c90: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
7ca0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
7cb0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
7cc0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ce0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
7cf0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
7d00: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
7d10: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
7d20: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
7d30: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
7d40: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
7d50: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
7d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
7d70: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7d80: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
7d90: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
7da0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7db0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
7dc0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
7dd0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
7de0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
7df0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
7e00: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
7e10: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
7e20: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
7e30: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
7e40: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
7e50: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
7e60: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
7e70: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
7e80: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
7e90: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
7ea0: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
7eb0: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
7ec0: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
7ed0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
7ee0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
7ef0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7f00: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
7f10: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
7f20: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
7f30: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
7f40: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
7f50: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
7f60: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
7f70: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
7f80: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
7f90: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
7fa0: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
7fb0: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
7fc0: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
7fd0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
7fe0: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
7ff0: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
8000: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8010: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8020: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
8030: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
8040: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
8050: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
8060: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
8070: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
8080: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8090: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
80a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
80b0: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
80c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
80d0: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
80e0: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
80f0: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
8100: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
8110: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
8120: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
8130: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
8140: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
8150: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
8160: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
8170: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
8180: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
8190: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
81a0: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
81b0: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
81c0: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
81d0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
81e0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
81f0: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
8200: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8210: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8220: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
8230: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
8240: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
8250: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
8260: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
8270: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
8280: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8290: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
82a0: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
82b0: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
82c0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
82d0: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
82e0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
82f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8300: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
8310: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8320: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
8330: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
8340: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
8350: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
8360: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
8370: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
8380: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
8390: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
83a0: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
83b0: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
83c0: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
83d0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
83e0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
83f0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
8400: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
8410: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8420: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
8430: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8440: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
8450: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
8460: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
8470: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
8480: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
8490: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
84a0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
84b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
84c0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
84d0: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
84e0: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
84f0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
8500: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
8510: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8520: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
8530: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
8540: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
8550: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
8560: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8570: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
8580: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
8590: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
85a0: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
85b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
85c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
85d0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
85e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
85f0: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
8600: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
8610: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8620: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8630: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
8640: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8650: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8660: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
8670: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
8680: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
8690: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
86a0: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
86b0: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
86c0: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
86d0: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
86e0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
86f0: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
8700: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
8710: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8720: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8730: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
8740: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8750: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
8760: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
8770: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
8780: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
8790: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
87a0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
87b0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
87c0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
87d0: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
87e0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
87f0: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
8800: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
8810: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8820: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8830: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
8840: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
8850: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
8860: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8870: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8880: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8890: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
88a0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
88b0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
88c0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88e0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
88f0: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
8900: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8920: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8930: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8940: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8950: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8960: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8970: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8980: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
8990: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
89a0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
89b0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
89c0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
89d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
89e0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
89f0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
8a00: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
8a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8a20: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8a30: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8a50: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8a60: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8a70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8a80: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
8a90: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8aa0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8ab0: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
8ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
8ad0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
8ae0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
8af0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
8b00: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
8b10: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8b20: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8b30: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8b40: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8b50: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8b60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8b70: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8b80: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
8b90: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8ba0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8bb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8bc0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
8bd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8be0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8bf0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8c00: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
8c10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8c20: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8c30: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8c40: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8c50: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8c60: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8c70: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8c80: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
8c90: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
8ca0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
8cb0: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
8cc0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
8cd0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
8ce0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
8cf0: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
8d00: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8d10: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
8d20: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
8d30: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
8d40: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
8d50: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
8d60: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
8d70: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
8d80: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
8d90: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
8da0: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
8db0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
8dc0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
8dd0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
8de0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
8df0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
8e00: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8e10: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8e20: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8e30: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8e40: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
8e50: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8e60: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
8e70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8e80: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8e90: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8ea0: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
8eb0: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
8ec0: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
8ed0: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
8ee0: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
8ef0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
8f00: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
8f10: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
8f20: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
8f30: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
8f40: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
8f50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8f60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8f70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8f80: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
8f90: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
8fa0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
8fb0: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
8fc0: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
8fd0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
8fe0: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
8ff0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9000: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9010: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
9020: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
9030: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9040: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9050: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
9060: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
9070: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
9080: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
9090: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
90a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
90b0: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
90c0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
90d0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
90e0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
90f0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9100: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
9110: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9120: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9130: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
9140: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
9150: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
9160: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
9170: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
9180: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
9190: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
91a0: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
91b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
91c0: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
91d0: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
91e0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
91f0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
9200: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
9210: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
9220: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
9230: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
9240: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
9250: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9260: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
9270: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
9280: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
9290: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
92a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
92b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
92c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
92d0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
92e0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
92f0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
9300: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
9310: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9320: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
9330: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
9340: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
9350: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
9360: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
9370: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
9380: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9390: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
93a0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
93b0: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
93c0: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
93d0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
93e0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
93f0: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
9400: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
9410: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
9420: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9430: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
9440: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
9450: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
9460: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
9470: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
9480: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9490: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
94a0: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
94b0: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
94c0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
94d0: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
94e0: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
94f0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
9500: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
9510: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9520: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
9530: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
9540: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
9550: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
9560: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
9570: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
9580: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
9590: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
95a0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
95b0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
95c0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
95d0: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
95e0: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
95f0: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
9600: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
9610: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9620: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
9630: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9650: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9660: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
9670: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
9680: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
96b0: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
96c0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
96d0: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
96e0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
96f0: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
9700: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
9710: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9720: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9730: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
9740: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
9750: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20   usableSize; /* 
9760: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74  Usable size of t
9770: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20  he page */.  .  
9780: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9790: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
97a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
97b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
97c0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
97d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
97e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
97f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9800: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
9810: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
9820: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
9830: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9840: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9850: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9860: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9870: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
9880: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
9890: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73  sableSize;.  ass
98a0: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61  ert( nByte < usa
98b0: 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20  bleSize-8 );..  
98c0: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
98d0: 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  +7];.  assert( p
98e0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
98f0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
9900: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
9910: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
9920: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
9930: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f  age->nCell;.  to
9940: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9950: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9960: 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  );.  if( gap>top
9970: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
9980: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9990: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
99a0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
99b0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
99c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
99d0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66  ap==top );..  if
99e0: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
99f0: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66     /* Always def
9a00: 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66  ragment highly f
9a10: 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20  ragmented pages 
9a20: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  */.    rc = defr
9a30: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
9a40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9a50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
9a60: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
9a70: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
9a80: 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
9a90: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
9aa0: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
9ab0: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
9ac0: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
9ad0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
9ae0: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
9af0: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
9b00: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
9b10: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
9b20: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
9b30: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
9b40: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
9b50: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61  ough to accomada
9b60: 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  te it..    */.  
9b70: 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a    int pc, addr;.
9b80: 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72      for(addr=hdr
9b90: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
9ba0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
9bb0: 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20  >0; addr=pc){.  
9bc0: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20      int size;   
9bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9be0: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
9bf0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
9c00: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c  c>usableSize-4 |
9c10: 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20  | pc<addr+4 ){. 
9c20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9c30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9c40: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
9c50: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
9c60: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
9c70: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e       if( size>=n
9c80: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
9c90: 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e  int x = size - n
9ca0: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65  Byte;.        te
9cb0: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
9cc0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9cd0: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
9ce0: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
9cf0: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
9d00: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
9d10: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
9d20: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
9d30: 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
9d40: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
9d50: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
9d60: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  . */.          m
9d70: 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72  emcpy(&data[addr
9d80: 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29  ], &data[pc], 2)
9d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  ;.          data
9da0: 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e  [hdr+7] = (u8)(n
9db0: 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20  Frag + x);.     
9dc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a     }else if( siz
9dd0: 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a  e+pc > usableSiz
9de0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
9df0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9e00: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
9e10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e20: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
9e30: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
9e40: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
9e50: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
9e60: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  ount.          *
9e70: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
9e80: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
9e90: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
9ea0: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
9eb0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
9ec0: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   x);.        }. 
9ed0: 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70         *pIdx = p
9ee0: 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72  c + x;.        r
9ef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9f00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9f10: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
9f20: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72  o make sure ther
9f30: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
9f40: 65 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20  e in the gap to 
9f50: 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65  satisfy.  ** the
9f60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66   allocation.  If
9f70: 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74   not, defragment
9f80: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
9f90: 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d  e( gap+2+nByte==
9fa0: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70  top );.  if( gap
9fb0: 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a  +2+nByte>top ){.
9fc0: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
9fd0: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
9fe0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9ff0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
a000: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
a010: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
a020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
a030: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
a040: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
a050: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
a060: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
a070: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
a080: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
a090: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
a0a0: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
a0b0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
a0c0: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
a0d0: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
a0e0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
a0f0: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
a100: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
a110: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
a120: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
a130: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
a140: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
a150: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
a160: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
a170: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
a180: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
a190: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
a1a0: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
a1b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a1c0: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
a1d0: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
a1e0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
a1f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
a200: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
a210: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a230: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
a240: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
a250: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
a260: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
a270: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
a280: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
a290: 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a  ->aDisk[start].*
a2a0: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
a2b0: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22  f the block is "
a2c0: 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a  size" bytes..**.
a2d0: 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65  ** Most of the e
a2e0: 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e  ffort here is in
a2f0: 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73  volved in coales
a300: 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  ing adjacent.** 
a310: 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f  free blocks into
a320: 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72   a single big fr
a330: 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ee block..*/.sta
a340: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
a350: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
a360: 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74  , int start, int
a370: 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64   size){.  int ad
a380: 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b  dr, pbegin, hdr;
a390: 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20  .  int iLast;   
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
a3c0: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
a3d0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
a3e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
a3f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
a400: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  a;..  assert( pP
a410: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
a420: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a430: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a440: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a450: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
a460: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
a470: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
a480: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
a490: 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20   assert( (start 
a4a0: 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29  + size) <= (int)
a4b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a4c0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
a4d0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a4e0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a4f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
a500: 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29  ssert( size>=0 )
a510: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
a520: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
a530: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ..  if( pPage->p
a540: 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65  Bt->secureDelete
a550: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77   ){.    /* Overw
a560: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
a570: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
a580: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
a590: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a  ure_delete.    *
a5a0: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
a5b0: 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
a5c0: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
a5d0: 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  0, size);.  }.. 
a5e0: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
a5f0: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
a600: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
a610: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65  reeblocks.  Note
a620: 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20   that.  ** even 
a630: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
a640: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
a650: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
a660: 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62  itPage(),.  ** b
a670: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64  treeInitPage() d
a680: 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  id not detect ov
a690: 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20  erlapping cells 
a6a0: 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  or.  ** freebloc
a6b0: 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70  ks that overlapp
a6c0: 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20  ed cells.   Nor 
a6d0: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77  does it detect w
a6e0: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  hen the.  ** cel
a6f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65  l content area e
a700: 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65  xceeds the value
a710: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
a720: 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20  der.  If these. 
a730: 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61   ** situations a
a740: 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65  rise, then subse
a750: 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65  quent insert ope
a760: 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f  rations might co
a770: 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66  rrupt.  ** the f
a780: 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20  reelist.  So we 
a790: 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  do need to check
a7a0: 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20   for corruption 
a7b0: 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20  while scanning. 
a7c0: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
a7d0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
a7e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
a7f0: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a800: 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61  1;.  iLast = pPa
a810: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a820: 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72  ize - 4;.  asser
a830: 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20  t( start<=iLast 
a840: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  );.  while( (pbe
a850: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a860: 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61  data[addr]))<sta
a870: 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29  rt && pbegin>0 )
a880: 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  {.    if( pbegin
a890: 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20  <addr+4 ){.     
a8a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a8b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a8c0: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62   }.    addr = pb
a8d0: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  egin;.  }.  if( 
a8e0: 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a  pbegin>iLast ){.
a8f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a900: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a910: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
a920: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
a930: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
a940: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
a950: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
a960: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
a970: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
a980: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
a990: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
a9a0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
a9b0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75  Page->nFree + (u
a9c0: 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  16)size;..  /* C
a9d0: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
a9e0: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
a9f0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
aa00: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
aa10: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
aa20: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
aa30: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
aa40: 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73  psize, x;.    as
aa50: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
aa60: 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
aa70: 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29   pbegin <= (int)
aa80: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
aa90: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
aaa0: 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65  pnext = get2byte
aab0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b  (&data[pbegin]);
aac0: 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74  .    psize = get
aad0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
aae0: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  in+2]);.    if( 
aaf0: 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b  pbegin + psize +
ab00: 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70   3 >= pnext && p
ab10: 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
ab20: 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74  int frag = pnext
ab30: 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65   - (pbegin+psize
ab40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72  );.      if( (fr
ab50: 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28  ag<0) || (frag>(
ab60: 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29  int)data[hdr+7])
ab70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ab80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ab90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
aba0: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
abb0: 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20  ] -= (u8)frag;. 
abc0: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
abd0: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b  e(&data[pnext]);
abe0: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
abf0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78  &data[pbegin], x
ac00: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65  );.      x = pne
ac10: 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  xt + get2byte(&d
ac20: 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20  ata[pnext+2]) - 
ac30: 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75  pbegin;.      pu
ac40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
ac50: 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  gin+2], x);.    
ac60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
ac70: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  r = pbegin;.    
ac80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
ac90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
aca0: 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68  area begins with
acb0: 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65   a freeblock, re
acc0: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66  move it. */.  if
acd0: 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64  ( data[hdr+1]==d
ace0: 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61  ata[hdr+5] && da
acf0: 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b  ta[hdr+2]==data[
ad00: 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e  hdr+6] ){.    in
ad10: 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69  t top;.    pbegi
ad20: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
ad30: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
ad40: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72  memcpy(&data[hdr
ad50: 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69  +1], &data[pbegi
ad60: 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20  n], 2);.    top 
ad70: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ad80: 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62  [hdr+5]) + get2b
ad90: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
ada0: 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79  +2]);.    put2by
adb0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
adc0: 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73   top);.  }.  ass
add0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
ade0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
adf0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
ae00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ae10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
ae20: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
ae30: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
ae40: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
ae50: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
ae60: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
ae70: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
ae80: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
ae90: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
aea0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
aeb0: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
aec0: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
aed0: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
aee0: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
aef0: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
af00: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
af10: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
af20: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
af30: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
af40: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
af50: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
af60: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
af70: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
af80: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
af90: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
afa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
afb0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
afc0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
afd0: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
afe0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
aff0: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
b000: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
b010: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
b020: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
b030: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
b040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b050: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b060: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b070: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
b080: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
b090: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
b0a0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
b0b0: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
b0c0: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
b0d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
b0e0: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
b0f0: 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20  ->leaf;.  pBt = 
b100: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
b110: 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46  ( flagByte==(PTF
b120: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
b130: 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70  INTKEY) ){.    p
b140: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
b150: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
b160: 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
b170: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
b180: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
b190: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
b1a0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
b1b0: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
b1c0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
b1d0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
b1e0: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
b1f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
b200: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b  ge->hasData = 0;
b210: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
b220: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
b230: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
b240: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
b250: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  >minLocal;.  }el
b260: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
b270: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b280: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
b290: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b2a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b2b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
b2c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
b2d0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
b2e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b2f0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b300: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
b310: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
b320: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
b330: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
b340: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
b350: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
b360: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
b370: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
b380: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
b390: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
b3a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
b3b0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
b3c0: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
b3d0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
b3e0: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
b3f0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
b400: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
b410: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
b420: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
b430: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b440: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b450: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b460: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b470: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b480: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
b490: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
b4a0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
b4b0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b4c0: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
b4d0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
b4e0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b4f0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b500: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
b510: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
b520: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
b530: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
b540: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
b550: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
b560: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b570: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
b580: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
b590: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b5b0: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
b5c0: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
b5d0: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
b5e0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
b5f0: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
b600: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
b610: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
b620: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
b630: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
b640: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
b650: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
b660: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
b670: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
b680: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
b690: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
b6a0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
b6b0: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
b6c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
b6d0: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
b6e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b6f0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
b700: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
b710: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
b720: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
b730: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
b740: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
b750: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
b760: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
b770: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
b780: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
b790: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
b7a0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
b7b0: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
b7c0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
b7d0: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
b7e0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
b7f0: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
b800: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b810: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
b820: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
b830: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
b840: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
b850: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b860: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
b870: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
b880: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
b890: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
b8a0: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
b8b0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
b8c0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
b8d0: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
b8e0: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
b8f0: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
b900: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
b910: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
b920: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
b930: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
b940: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
b950: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
b960: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
b970: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
b980: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
b990: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
b9a0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
b9b0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
b9c0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
b9d0: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
b9e0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
b9f0: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
ba00: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
ba10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ba20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ba30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
ba40: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
ba50: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
ba60: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
ba70: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
ba80: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
ba90: 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
baa0: 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a  t the end.    **
bab0: 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61   of page when pa
bac0: 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a  rsing a cell.  .
bad0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
bae0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
baf0: 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73  k of code checks
bb00: 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66   early to see if
bb10: 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a   a cell extends.
bb20: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
bb30: 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
bb40: 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
bb50: 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
bb60: 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72   to be .    ** r
bb70: 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f  eturned if it do
bb80: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
bb90: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
bba0: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
bbb0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65  ->nCell;.    iCe
bbc0: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
bbd0: 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66  ize - 4;.#if def
bbe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
bbf0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
bc00: 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20  _CHECK).    {.  
bc10: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
bc20: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
bc30: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
bc40: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
bc50: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
bc60: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
bc70: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
bc80: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bc90: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
bca0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
bcb0: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
bcc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
bcd0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
bce0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a  ta[cellOffset+i*
bcf0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  2]);.        tes
bd00: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
bd10: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20  First );.       
bd20: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
bd30: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
bd40: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bd50: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bd60: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
bd70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bd80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bd90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bda0: 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
bdb0: 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
bdc0: 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  c]);.        tes
bdd0: 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
bde0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
bdf0: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
be00: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
be10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
be20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
be30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
be40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
be50: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
be60: 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20  llLast++;.    } 
be70: 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a   .#endif..    /*
be80: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
be90: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
bea0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
beb0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
bec0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
bed0: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
bee0: 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20  dr+7] + top;.   
bef0: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
bf00: 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20        u16 next, 
bf10: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
bf20: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bf30: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bf40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  .        /* Star
bf50: 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20  t of free block 
bf60: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
bf70: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
bf80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bf90: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
bfa0: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
bfb0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
bfc0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
bfd0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
bfe0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
bff0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
c000: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
c010: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
c020: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
c030: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
c040: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
c050: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
c060: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 09 2a 2a  last byte of..**
c070: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
c080: 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20  must lie on the 
c090: 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
c0a0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
c0b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c0c0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
c0d0: 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46        nFree = nF
c0e0: 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20  ree + size;.    
c0f0: 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20    pc = next;.   
c100: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
c110: 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
c120: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
c130: 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
c140: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20  o the start.    
c150: 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
c160: 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
c170: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
c180: 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
c190: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c  .    ** the cell
c1a0: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49  -content area. I
c1b0: 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65  f this is greate
c1c0: 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c  r than the usabl
c1d0: 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66  e-size.    ** of
c1e0: 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
c1f0: 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  the page must be
c200: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
c210: 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20   check also.    
c220: 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
c230: 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
c240: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
c250: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
c260: 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61  tent.    ** area
c270: 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
c280: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
c290: 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
c2a0: 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
c2b0: 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
c2c0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
c2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c2e0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c2f0: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  }.    pPage->nFr
c300: 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
c310: 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
c320: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
c330: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
c340: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c350: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
c360: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
c370: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
c380: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
c390: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
c3a0: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
c3b0: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
c3c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c3d0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
c3e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
c3f0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
c400: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
c410: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
c420: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
c430: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
c440: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
c450: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c460: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
c470: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
c480: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
c490: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
c4a0: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
c4b0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
c4c0: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
c4d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
c4e0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
c4f0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
c500: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
c510: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
c520: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
c530: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
c540: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c550: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
c560: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
c570: 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29  ->secureDelete )
c580: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
c590: 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
c5a0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
c5b0: 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
c5c0: 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
c5d0: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
c5e0: 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73   + 8 + 4*((flags
c5f0: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31  &PTF_LEAF)==0 ?1
c600: 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  :0);.  memset(&d
c610: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
c620: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
c630: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
c640: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
c650: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
c660: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
c670: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
c680: 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
c690: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
c6a0: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
c6b0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c6c0: 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65  t = hdr;.  pPage
c6d0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
c6e0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  irst;.  pPage->n
c6f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
c700: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
c710: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
c720: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
c730: 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
c740: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
c750: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c760: 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  1);.  pPage->nCe
c770: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
c780: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
c790: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
c7a0: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
c7b0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
c7c0: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
c7d0: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
c7e0: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
c7f0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
c800: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
c810: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
c820: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
c830: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
c840: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
c850: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
c860: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c870: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
c880: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
c890: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c8a0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
c8b0: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
c8c0: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
c8d0: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
c8e0: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
c8f0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c900: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
c910: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
c920: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
c930: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
c940: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
c950: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
c960: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
c970: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
c980: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
c990: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
c9a0: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
c9b0: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
c9c0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
c9d0: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
c9e0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
c9f0: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
ca00: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
ca10: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
ca20: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
ca30: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
ca40: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
ca50: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
ca60: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
ca70: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
ca80: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
ca90: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
caa0: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
cab0: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
cac0: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
cad0: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
cae0: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
caf0: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
cb00: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
cb10: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
cb20: 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
cb30: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
cb40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
cb50: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
cb60: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
cb70: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
cb80: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
cb90: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
cba0: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
cbb0: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
cbc0: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
cbd0: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
cbe0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
cbf0: 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
cc00: 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
cc10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
cc20: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
cc30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cc40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cc50: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
cc60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
cc70: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
cc80: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
cc90: 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f  *)&pDbPage, noCo
cca0: 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ntent);.  if( rc
ccb0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
ccc0: 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
ccd0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
cce0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
ccf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
cd00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
cd10: 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
cd20: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
cd30: 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
cd40: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
cd50: 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
cd60: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
cd70: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
cd80: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
cd90: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
cda0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
cdb0: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
cdc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
cdd0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
cde0: 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
cdf0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
ce00: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
ce10: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
ce20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ce30: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ce40: 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
ce50: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
ce60: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
ce70: 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
ce80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
ce90: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
cea0: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
ceb0: 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
cec0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
ced0: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
cee0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
cef0: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
cf00: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
cf10: 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
cf20: 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
cf30: 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
cf40: 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65  tatic Pgno btree
cf50: 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
cf60: 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75  ed *pBt){.  retu
cf70: 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  rn pBt->nPage;.}
cf80: 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65  .u32 sqlite3Btre
cf90: 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20  eLastPage(Btree 
cfa0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
cfb0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
cfc0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
cfd0: 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e  sert( ((p->pBt->
cfe0: 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30  nPage)&0x8000000
cff0: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
d000: 20 28 69 6e 74 29 62 74 72 65 65 50 61 67 65 63   (int)btreePagec
d010: 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
d020: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
d030: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
d040: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
d050: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
d060: 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63  e is just a.** c
d070: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
d080: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
d090: 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  te calls to btre
d0a0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a  eGetPage() and .
d0b0: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
d0c0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
d0d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
d0e0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70  en the value *pp
d0f0: 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69  Page is set to i
d100: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
d110: 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
d120: 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
d130: 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
d140: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
d150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
d160: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
d170: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
d180: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
d190: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
d1a0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
d1b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d1c0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
d1d0: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
d1e0: 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20  **ppPage     /* 
d1f0: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
d200: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29  ointer here */.)
d210: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
d220: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d230: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d240: 74 65 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 70  tex) );..  if( p
d250: 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
d260: 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
d270: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
d280: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
d290: 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
d2a0: 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
d2b0: 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
d2c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d2d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
d2e0: 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
d2f0: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
d300: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d310: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
d320: 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
d330: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
d340: 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  }.  }..  testcas
d350: 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20  e( pgno==0 );.  
d360: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
d370: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  || rc==SQLITE_CO
d380: 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72  RRUPT );.  retur
d390: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
d3a0: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
d3b0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
d3c0: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
d3d0: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
d3e0: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74  call to btreeGet
d3f0: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
d400: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
d410: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
d420: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
d430: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
d440: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
d450: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d460: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
d470: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
d480: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
d490: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
d4a0: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61  *)pPage );.    a
d4b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d4c0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
d4d0: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
d4e0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
d4f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d500: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d510: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d520: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
d530: 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44  rUnref(pPage->pD
d540: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
d550: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
d560: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
d570: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
d580: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
d590: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
d5a0: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
d5b0: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
d5c0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
d5d0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
d5e0: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
d5f0: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
d600: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
d610: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d620: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
d630: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
d640: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
d650: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
d660: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
d670: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
d680: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
d690: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
d6a0: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
d6b0: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
d6c0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
d6d0: 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
d6e0: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
d6f0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
d700: 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
d710: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d720: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
d730: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
d740: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
d750: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d760: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d770: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d780: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
d790: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
d7a0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d7b0: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
d7c0: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
d7d0: 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
d7e0: 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
d7f0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
d800: 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
d810: 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
d820: 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
d830: 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
d840: 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
d850: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
d860: 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
d870: 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
d880: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d890: 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
d8a0: 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
d8b0: 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
d8c0: 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
d8d0: 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
d8e0: 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
d8f0: 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
d900: 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
d910: 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
d920: 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
d930: 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
d940: 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
d950: 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
d960: 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
d970: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
d980: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
d990: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
d9a0: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
d9b0: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
d9c0: 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
d9d0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
d9e0: 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
d9f0: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
da00: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
da10: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
da20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
da30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
da40: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
da50: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
da60: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
da70: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
da80: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
da90: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
daa0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
dab0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
dac0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
dad0: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
dae0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
daf0: 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
db00: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
db10: 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
db20: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
db30: 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
db40: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
db50: 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
db60: 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
db70: 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
db80: 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
db90: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
dba0: 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
dbb0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
dbc0: 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
dbd0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
dbe0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
dbf0: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
dc00: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
dc10: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
dc20: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
dc30: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
dc40: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
dc50: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
dc60: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
dc70: 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
dc80: 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
dc90: 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
dca0: 6e 74 61 69 6e 20 62 69 74 73 0a 2a 2a 20 42 54  ntain bits.** BT
dcb0: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
dcc0: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4e 4f   and/or BTREE_NO
dcd0: 5f 52 45 41 44 4c 4f 43 4b 2e 20 20 54 68 65 20  _READLOCK.  The 
dce0: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
dcf0: 4b 0a 2a 2a 20 62 69 74 20 69 73 20 61 6c 73 6f  K.** bit is also
dd00: 20 73 65 74 20 69 66 20 74 68 65 20 53 51 4c 49   set if the SQLI
dd10: 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 66 6c  TE_NoReadlock fl
dd20: 61 67 73 20 69 73 20 73 65 74 20 69 6e 20 64 62  ags is set in db
dd30: 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 73  ->flags..** Thes
dd40: 65 20 66 6c 61 67 73 20 61 72 65 20 70 61 73 73  e flags are pass
dd50: 65 64 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ed through into 
dd60: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
dd70: 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62  () and must.** b
dd80: 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
dd90: 73 20 61 73 20 50 41 47 45 52 5f 4f 4d 49 54 5f  s as PAGER_OMIT_
dda0: 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45  JOURNAL and PAGE
ddb0: 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a  R_NO_READLOCK..*
ddc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
ddd0: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
dde0: 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
ddf0: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
de00: 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
de10: 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
de20: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
de30: 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
de40: 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
de50: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
de60: 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
de70: 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
de80: 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
de90: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
dea0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
deb0: 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
dec0: 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
ded0: 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
dee0: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
def0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
df00: 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
df10: 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
df20: 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
df30: 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
df40: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
df50: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
df60: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
df70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
df80: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
df90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
dfa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
dfb0: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
dfc0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
dfd0: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
dfe0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
dff0: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
e000: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
e010: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
e020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e030: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
e040: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
e050: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
e060: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
e070: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
e080: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
e090: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e0b0: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
e0c0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
e0d0: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
e100: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
e110: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
e120: 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
e130: 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
e140: 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
e150: 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
e160: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
e180: 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
e190: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
e1a0: 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
e1d0: 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
e1e0: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
e1f0: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
e200: 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
e210: 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
e220: 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
e230: 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
e240: 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
e250: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
e260: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
e270: 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
e280: 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
e290: 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
e2a0: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
e2b0: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
e2c0: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
e2d0: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
e2e0: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
e2f0: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
e300: 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
e310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
e320: 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
e330: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
e340: 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
e350: 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
e360: 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
e370: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
e380: 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
e3b0: 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
e3c0: 65 6d 6f 72 79 28 64 62 29 29 3b 0a 23 65 6e 64  emory(db));.#end
e3d0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
e3e0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e3f0: 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
e400: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e410: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
e420: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e430: 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
e440: 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
e450: 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
e460: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
e470: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
e480: 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
e490: 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
e4a0: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
e4b0: 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
e4c0: 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
e4d0: 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
e4e0: 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
e4f0: 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
e500: 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
e510: 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
e520: 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
e530: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
e540: 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
e550: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
e560: 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  );..  if( db->fl
e570: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 52  ags & SQLITE_NoR
e580: 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 66  eadlock ){.    f
e590: 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4e 4f  lags |= BTREE_NO
e5a0: 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  _READLOCK;.  }. 
e5b0: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
e5c0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
e5d0: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
e5e0: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
e5f0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
e600: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
e610: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
e620: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
e630: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
e640: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
e650: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
e660: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
e670: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
e680: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
e690: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
e6a0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
e6b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e6c0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
e6d0: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
e6e0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
e6f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e700: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
e710: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
e720: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
e730: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
e740: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
e750: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
e760: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
e770: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
e780: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
e790: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
e7a0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
e7b0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
e7c0: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
e7d0: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
e7e0: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
e7f0: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
e800: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
e810: 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 69 73 54  sMemdb==0 && isT
e820: 65 6d 70 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  empDb==0 ){.    
e830: 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
e840: 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
e850: 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
e860: 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
e870: 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
e880: 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
e890: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
e8a0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
e8b0: 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  c(nFullPathname)
e8c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e8d0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
e8e0: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  ed;.      p->sha
e8f0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
e900: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
e910: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
e920: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e930: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e940: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e950: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e960: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e970: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
e980: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
e990: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e9a0: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
e9b0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e9c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e9d0: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
e9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e9f0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
ea00: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
ea10: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
ea20: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ea30: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
ea40: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
ea50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ea60: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
ea70: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
ea80: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
ea90: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
eaa0: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
eab0: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
eac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ead0: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
eae0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
eaf0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
eb00: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
eb10: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
eb20: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
eb30: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
eb40: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
eb50: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
eb60: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
eb70: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
eb80: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
eb90: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
ebb0: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
ebc0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
ebe0: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
ebf0: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
ec00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ec10: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ec20: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
ec30: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
ec40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ec50: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
ec60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ec70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
ec80: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
eca0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
ecb0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
ecc0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
ecd0: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
ece0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
ecf0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
ed00: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
ed10: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
ed20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ed30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ed40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ed50: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
ed60: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
ed70: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
ed80: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ed90: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
eda0: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
edb0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
edc0: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
edd0: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
ede0: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
edf0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
ee00: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
ee10: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
ee20: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
ee30: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
ee40: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
ee50: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
ee60: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
ee70: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
ee80: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
ee90: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
eea0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
eeb0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
eec0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
eed0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
eee0: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
eef0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
ef00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
ef10: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
ef20: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
ef30: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
ef40: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
ef50: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
ef60: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
ef70: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
ef80: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
ef90: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
efa0: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
efb0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
efc0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
efd0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
efe0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
eff0: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
f000: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
f010: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
f020: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
f030: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
f040: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
f050: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
f060: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
f070: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
f080: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
f090: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
f0a0: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
f0b0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
f0c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
f0d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
f0e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
f0f0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
f100: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
f110: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
f120: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
f130: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
f160: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
f170: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
f180: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f190: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
f1a0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
f1b0: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
f1c0: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
f1d0: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
f1e0: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
f1f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f200: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
f210: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
f230: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
f240: 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
f250: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
f260: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
f270: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
f280: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
f290: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
f2a0: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
f2b0: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
f2c0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
f2d0: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
f2e0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
f2f0: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
f300: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
f310: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 23 69 66  Bt->pPager);.#if
f320: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
f330: 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
f340: 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
f350: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70   1;.#endif.    p
f360: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
f370: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
f380: 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
f390: 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
f3a0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
f3b0: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
f3c0: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
f3d0: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
f3e0: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
f3f0: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
f400: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
f410: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f420: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
f430: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f440: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
f450: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
f460: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
f470: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
f480: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
f490: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
f4a0: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
f4b0: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
f4c0: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
f4d0: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
f4e0: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
f4f0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
f500: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
f510: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
f520: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
f530: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
f540: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
f550: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
f560: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
f570: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
f580: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
f590: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
f5a0: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
f5b0: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
f5c0: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
f5d0: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
f5e0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
f5f0: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
f600: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
f610: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
f620: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
f630: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
f640: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
f650: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
f660: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f670: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
f680: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
f690: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
f6a0: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
f6b0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
f6c0: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
f6d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f6e0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f6f0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
f700: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
f710: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
f720: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
f730: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f740: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
f750: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
f760: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
f770: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
f780: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
f790: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
f7a0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
f7b0: 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
f7c0: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
f7d0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f7e0: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
f7f0: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
f800: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
f810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
f820: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
f830: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
f840: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
f850: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
f860: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f870: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f880: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
f890: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
f8a0: 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
f8b0: 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
f8c0: 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
f8d0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
f8e0: 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
f8f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f900: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
f910: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f920: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
f930: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
f940: 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  = 1;.      mutex
f950: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
f960: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f970: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
f980: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66  ASTER);.      if
f990: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
f9a0: 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
f9b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
f9c0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
f9d0: 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
f9e0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
f9f0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
fa00: 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
fa10: 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
fa20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
fa30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fa40: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
fa50: 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
fa60: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
fa70: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
fa80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
fa90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
faa0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
fab0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
fac0: 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
fad0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
fae0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
faf0: 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
fb00: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
fb10: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
fb20: 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
fb30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
fb40: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
fb50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
fb60: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
fb70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
fb80: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
fb90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fba0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
fbb0: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
fbc0: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
fbd0: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
fbe0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
fbf0: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
fc00: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
fc10: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
fc20: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
fc30: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
fc40: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
fc50: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
fc60: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
fc70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
fc80: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
fc90: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
fca0: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
fcb0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
fcc0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
fcd0: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
fce0: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
fcf0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
fd00: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
fd10: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
fd20: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
fd30: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
fd40: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
fd50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
fd60: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
fd70: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
fd80: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
fd90: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
fda0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fdb0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
fdc0: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
fdd0: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
fde0: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
fdf0: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
fe00: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
fe10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fe20: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
fe30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
fe40: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
fe50: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
fe60: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
fe70: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
fe80: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
fe90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fea0: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
feb0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
fec0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fed0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
fee0: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
fef0: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
ff00: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
ff10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ff20: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
ff30: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
ff40: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
ff50: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
ff60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ff70: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
ff80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff90: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
ffa0: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
ffb0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
ffc0: 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
ffd0: 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
ffe0: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
fff0: 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
10000 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
10010 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
10020 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
10030 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
10040 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
10050 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
10060 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
10070 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
10080 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
10090 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
100a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
100b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
100c0 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
100d0 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
100e0 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
100f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
10100 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
10110 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10120 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
10130 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
10140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10150 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
10160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
10180 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
10190 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
101a0 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
101b0 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
101c0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
101d0 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
101e0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
101f0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
10200 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
10210 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
10220 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
10230 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
10240 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
10250 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
10260 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
10270 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
10280 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
10290 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
102a0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
102b0 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
102c0 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
102d0 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
102e0 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
102f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10300 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
10310 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
10320 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
10330 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10340 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10350 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
10360 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
10370 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
10380 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
10390 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
103a0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
103b0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
103c0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
103d0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
103e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
103f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10400 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
10410 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10420 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
10430 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10440 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10450 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
10460 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
10470 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
10480 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
10490 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
104a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
104b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
104c0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
104d0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
104e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
104f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
10500 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10510 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10520 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
10530 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
10540 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
10550 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
10560 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
10570 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
10580 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
10590 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
105a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
105b0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
105c0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
105d0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
105e0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
105f0 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
10600 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
10610 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
10620 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
10630 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
10640 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
10650 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
10660 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
10670 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
10680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
10690 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
106a0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
106b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
106c0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
106d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
106e0 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
106f0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
10700 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
10710 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
10720 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
10730 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
10740 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
10750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10760 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
10770 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
10780 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10790 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
107a0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
107b0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
107c0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
107d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
107e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
107f0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10800 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10810 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
10820 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
10830 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
10840 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
10850 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
10860 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
10870 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
10880 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
10890 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
108a0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
108b0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
108c0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
108d0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
108e0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
108f0 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
10900 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
10910 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
10920 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
10930 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
10940 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
10950 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
10960 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
10970 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
10980 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10990 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
109a0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
109b0 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
109c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
109d0 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
109e0 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
109f0 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
10a00 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
10a10 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
10a20 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
10a30 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
10a40 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
10a50 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
10a60 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
10a70 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
10a80 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
10a90 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
10aa0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
10ab0 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
10ac0 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
10ad0 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
10ae0 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
10af0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10b00 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
10b10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
10b20 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
10b30 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
10b40 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
10b50 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
10b60 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
10b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
10b80 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
10b90 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
10ba0 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
10bb0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
10bc0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
10bd0 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
10be0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10bf0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
10c00 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10c10 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10c20 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10c30 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10c40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10c50 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10c60 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
10c70 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
10c80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
10c90 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
10ca0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
10cb0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10cc0 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10cd0 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10ce0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10cf0 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10d00 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10d20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10d30 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
10d40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10d50 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
10d60 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
10d70 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
10d80 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
10d90 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
10da0 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
10db0 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
10dc0 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
10dd0 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
10de0 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
10df0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
10e00 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
10e10 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
10e20 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
10e30 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
10e40 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
10e50 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
10e60 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
10e70 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
10e80 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
10e90 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
10ea0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
10eb0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
10ec0 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
10ed0 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
10ee0 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
10ef0 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10f00 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
10f10 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
10f20 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
10f30 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
10f40 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10f50 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
10f60 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
10f70 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
10f80 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
10f90 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
10fa0 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
10fb0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10fc0 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
10fd0 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
10fe0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10ff0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
11000 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
11010 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
11020 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11030 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11040 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
11050 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11060 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11070 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11080 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
11090 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
110a0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
110b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
110c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
110d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
110e0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
110f0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
11100 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
11110 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
11120 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
11130 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
11140 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
11150 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
11160 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
11170 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
11180 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
11190 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
111a0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
111b0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
111c0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
111d0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
111e0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
111f0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
11200 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
11210 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
11220 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
11230 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11240 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11250 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11260 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
11270 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
11280 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
11290 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
112a0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
112b0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
112c0 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
112d0 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  el(.  Btree *p, 
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112f0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
11300 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
11310 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  l on */.  int le
11320 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
11330 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
11340 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
11350 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
11360 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79   */.  int fullSy
11370 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nc,          /* 
11380 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
11390 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46  . */.  int ckptF
113a0 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a  ullSync       /*
113b0 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
113c0 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29  nt_fullfync */.)
113d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
113e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
113f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11400 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11410 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11420 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
11430 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71  level<=3 );.  sq
11440 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11450 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11460 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
11470 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
11480 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63  vel, fullSync, c
11490 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  kptFullSync);.  
114a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
114b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
114c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
114d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
114e0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
114f0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
11500 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
11510 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
11520 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
11530 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
11540 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
11550 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
11560 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
11570 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
11580 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
11590 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
115a0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
115b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
115c0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
115d0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
115e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
115f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
11600 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
11610 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11620 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
11630 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
11640 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11660 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11670 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
11680 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
11690 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
116a0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
116b0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
116c0 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
116d0 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
116e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
116f0 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
11700 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
11710 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
11720 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
11730 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
11740 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
11750 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
11760 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
11770 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
11780 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
11790 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
117a0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
117b0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
117c0 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
117d0 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
117e0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
117f0 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
11800 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
11810 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
11820 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
11830 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
11840 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
11850 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
11860 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
11870 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
11880 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
11890 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
118a0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
118b0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
118c0 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
118d0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
118e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
118f0 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
11900 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
11910 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
11920 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
11930 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46  en the pageSizeF
11940 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ixed flag is set
11950 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
11960 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
11970 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
11980 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
11990 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
119a0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
119b0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
119c0 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
119d0 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
119e0 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
119f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11a00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11a10 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
11a20 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
11a30 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
11a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11a50 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
11a60 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
11a70 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
11a80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11a90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11aa0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
11ab0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
11ac0 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
11ad0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
11ae0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
11af0 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
11b00 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
11b10 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
11b20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
11b30 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
11b40 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
11b50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
11b60 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
11b70 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
11b80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
11b90 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
11ba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
11bb0 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
11bc0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
11bd0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
11be0 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
11bf0 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
11c00 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
11c10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11c20 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
11c30 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
11c40 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
11c50 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
11c60 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
11c70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
11c80 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
11c90 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53  Fix ) pBt->pageS
11ca0 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20  izeFixed = 1;.  
11cb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11cc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11cd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11ce0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
11cf0 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
11d00 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
11d10 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
11d20 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
11d30 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
11d40 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 21  geSize;.}..#if !
11d50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11d60 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
11d70 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
11d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
11d90 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  M)./*.** Return 
11da0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
11db0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
11dc0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
11dd0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
11de0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
11df0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
11e00 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11e10 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11e20 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11e30 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
11e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11e50 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
11e60 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11e70 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11e80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11e90 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
11ea0 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
11eb0 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
11ec0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11ed0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
11ee0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
11ef0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11f00 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11f10 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11f20 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11f30 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
11f40 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
11f50 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
11f60 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
11f70 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
11f80 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
11f90 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
11fa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11fb0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
11fc0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
11fd0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
11fe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11ff0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
12000 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
12010 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
12020 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
12030 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12040 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12050 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
12060 74 68 65 20 73 65 63 75 72 65 44 65 6c 65 74 65  the secureDelete
12070 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
12080 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
12090 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
120a0 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
120b0 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
120c0 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
120d0 20 6f 66 20 74 68 65 20 73 65 63 75 72 65 44 65   of the secureDe
120e0 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20  lete.** setting 
120f0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
12100 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12110 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
12120 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
12130 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
12140 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
12150 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
12160 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12170 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
12180 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
12190 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
121a0 20 28 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20   (newFlag!=0) ? 
121b0 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20  1 : 0;.  } .  b 
121c0 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65  = p->pBt->secure
121d0 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65  Delete;.  sqlite
121e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
121f0 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65    return b;.}.#e
12200 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
12210 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
12220 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
12230 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12240 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
12250 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12260 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
12270 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
12280 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
12290 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
122a0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
122b0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
122c0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
122d0 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
122e0 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
122f0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
12300 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
12310 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
12320 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
12330 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
12340 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
12350 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
12360 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12370 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
12380 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
12390 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
123a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
123b0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
123c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
123d0 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
123e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
123f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12400 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
12410 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
12420 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12430 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
12440 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12450 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29  xed && (av ?1:0)
12460 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
12470 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
12480 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
124a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
124b0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
124c0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
124d0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
124e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
124f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12500 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
12510 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
12520 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
12530 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12540 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
12550 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
12560 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
12570 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
12580 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12590 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
125a0 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
125b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
125c0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
125d0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
125e0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
125f0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
12600 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12610 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
12620 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12630 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
12640 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
12650 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
12660 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
12670 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
12680 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
12690 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
126a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
126b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
126c0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
126d0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
126e0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
126f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
12700 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
12710 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
12720 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
12730 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
12740 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
12750 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
12760 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
12770 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
12780 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
12790 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
127a0 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
127b0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
127c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
127d0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
127e0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
127f0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
12800 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
12810 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
12820 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
12830 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
12840 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
12850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12860 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
12870 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
12880 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
12890 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
128a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
128b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
128c0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
128d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
128e0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
128f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
12900 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
12910 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
12920 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
12930 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
12940 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
12950 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
12960 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
12970 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
12980 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
12990 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
129a0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
129b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
129c0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
129d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
129e0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
129f0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
12a00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
12a20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
12a30 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
12a40 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
12a50 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12a60 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
12a70 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
12a80 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
12a90 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
12aa0 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
12ab0 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
12ac0 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
12ad0 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
12ae0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
12af0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
12b00 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12b10 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
12b20 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
12b30 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
12b40 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
12b50 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12b60 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
12b70 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
12b80 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
12b90 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
12ba0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
12bb0 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
12bc0 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
12bd0 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
12be0 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
12bf0 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
12c00 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
12c10 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
12c20 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
12c30 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
12c40 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12c50 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12c60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12c70 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
12c80 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
12c90 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12ca0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12cb0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
12cc0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12cd0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12ce0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
12cf0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
12d00 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
12d10 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
12d20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
12d30 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
12d40 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12d50 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12d60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
12d70 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
12d80 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
12d90 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
12da0 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
12db0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
12dc0 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
12dd0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
12de0 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
12df0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
12e00 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
12e10 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
12e20 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
12e30 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
12e40 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
12e50 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
12e60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
12e70 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
12e80 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
12e90 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
12ea0 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
12eb0 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
12ec0 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
12ed0 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
12ee0 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
12ef0 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
12f00 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
12f10 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
12f20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
12f30 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d  1[19]==2 && pBt-
12f40 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20  >doNotUseWAL==0 
12f50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
12f60 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
12f70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12f80 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
12f90 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
12fa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12fb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12fc0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12fd0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
12fe0 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
12ff0 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
13000 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
13010 5f 53 41 46 45 54 59 4c 45 56 45 4c 0a 20 20 20  _SAFETYLEVEL.   
13020 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
13030 74 6f 20 73 70 65 63 69 66 69 65 64 20 73 61 66  to specified saf
13040 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 57 41  ety_level for WA
13050 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  L mode */.      
13060 20 20 69 66 28 20 70 42 74 2d 3e 64 62 21 3d 30    if( pBt->db!=0
13070 20 26 26 20 70 42 74 2d 3e 64 62 2d 3e 61 44 62   && pBt->db->aDb
13080 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
13090 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
130a0 42 74 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  Bt->db;.        
130b0 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d    if( db->aDb[0]
130c0 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 21 3d  .safety_level !=
130d0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
130e0 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 29  WAL_SAFETYLEVEL)
130f0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   {.            d
13100 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
13110 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f  _level = SQLITE_
13120 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45  DEFAULT_WAL_SAFE
13130 54 59 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20  TYLEVEL;.       
13140 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
13150 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
13160 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
13170 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
13180 53 41 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20  SAFETYLEVEL, .  
13190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131b0 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26       (db->flags&
131c0 53 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63  SQLITE_FullFSync
131d0 29 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20  )!=0,.          
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62               (db
13200 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43  ->flags&SQLITE_C
13210 6b 70 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30  kptFullFSync)!=0
13220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
13230 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
13240 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
13250 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
13260 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13270 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
13280 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13290 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
132a0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
132b0 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
132c0 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
132d0 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
132e0 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
132f0 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
13300 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13310 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
13320 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
13330 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
13340 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
13350 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
13360 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
13370 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
13380 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
13390 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
133a0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
133b0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
133c0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
133d0 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
133e0 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
133f0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13400 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13410 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
13420 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
13430 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
13440 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  16);.    if( ((p
13450 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
13460 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
13470 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
13480 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
13490 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
134a0 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
134b0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
134c0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
134d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
134e0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
134f0 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
13500 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
13510 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
13520 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
13530 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
13540 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
13550 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
13560 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
13570 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
13580 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
13590 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
135a0 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
135b0 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
135c0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
135d0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
135e0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
135f0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
13600 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
13610 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
13620 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
13630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
13640 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
13650 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
13660 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
13670 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
13680 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
13690 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
136a0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
136b0 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
136c0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
136d0 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
136e0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
136f0 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
13700 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
13710 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13720 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
13730 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
13740 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13770 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
13780 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
13790 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
137a0 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
137b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
137c0 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
137d0 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
137e0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
137f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13800 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
13810 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13820 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
13830 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
13840 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
13850 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
13870 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
13880 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
13890 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
138a0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
138b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
138c0 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
138d0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
138e0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
138f0 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
13900 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13910 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13920 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
13930 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
13940 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
13950 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
13960 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
13970 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
13980 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
13990 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
139a0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
139b0 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
139c0 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
139d0 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
139e0 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
139f0 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
13a00 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
13a10 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
13a20 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
13a30 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
13a40 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
13a50 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
13a60 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
13a70 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
13a80 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
13a90 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
13aa0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
13ab0 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
13ac0 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
13ad0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
13ae0 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
13af0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
13b00 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
13b10 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
13b20 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
13b30 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
13b40 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
13b50 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
13b60 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
13b70 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
13b80 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
13b90 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
13ba0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
13bb0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
13bc0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
13bd0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
13be0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
13bf0 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
13c00 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
13c10 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
13c20 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
13c30 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
13c40 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
13c50 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13c60 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
13c70 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
13c80 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
13c90 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
13ca0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
13cb0 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74   = pPage1;.  pBt
13cc0 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
13cd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
13ce0 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
13cf0 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
13d00 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13d10 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13d20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
13d30 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  }../*.** If ther
13d40 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
13d50 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
13d60 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
13d70 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
13d80 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
13d90 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
13da0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
13db0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
13dc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
13dd0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
13de0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
13df0 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
13e00 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
13e10 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
13e20 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
13e30 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
13e40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
13e50 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
13e60 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13e70 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
13e80 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
13e90 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
13ea0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
13eb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13ec0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13ee0 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70  >pCursor==0 || p
13ef0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13f00 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
13f10 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
13f20 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
13f30 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
13f40 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ge1!=0 ){.    as
13f50 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
13f60 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
13f70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
13f80 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
13f90 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
13fa0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
13fb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
13fc0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
13fd0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
13fe0 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
13ff0 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
14000 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
14010 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
14020 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
14030 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
14040 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
14050 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
14060 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
14070 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
14080 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
14090 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
140a0 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
140b0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
140c0 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
140d0 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
140e0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
140f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14100 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
14110 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
14120 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
14130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14140 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
14150 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
14160 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
14170 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
14180 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
14190 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
141a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
141b0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
141c0 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
141d0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
141e0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
141f0 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
14200 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
14210 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
14220 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
14230 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
14240 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
14250 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
14260 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
14270 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
14280 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
14290 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
142a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
142b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
142c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
142d0 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
142e0 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
142f0 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
14300 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
14310 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
14320 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
14330 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
14340 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
14350 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
14360 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
14370 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
14380 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
14390 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
143a0 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  .  pBt->pageSize
143b0 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
143c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
143d0 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65  UTOVACUUM.  asse
143e0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
143f0 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61  uum==1 || pBt->a
14400 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  utoVacuum==0 );.
14410 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
14420 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  ncrVacuum==1 || 
14430 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
14440 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  =0 );.  put4byte
14450 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d  (&data[36 + 4*4]
14460 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  , pBt->autoVacuu
14470 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  m);.  put4byte(&
14480 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20  data[36 + 7*4], 
14490 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
144a0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e  ;.#endif.  pBt->
144b0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74  nPage = 1;.  dat
144c0 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74  a[31] = 1;.  ret
144d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
144e0 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
144f0 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
14500 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
14510 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
14520 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
14530 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14540 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
14550 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
14560 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
14570 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
14580 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
14590 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
145a0 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
145b0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
145c0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
145d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
145e0 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
145f0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
14600 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
14610 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
14620 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
14630 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
14640 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
14650 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
14660 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
14670 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
14680 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
14690 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
146a0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
146b0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
146c0 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
146d0 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
146e0 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
146f0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
14700 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
14710 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
14720 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
14730 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
14740 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
14750 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
14760 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
14770 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
14780 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14790 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
147a0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
147b0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
147c0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
147d0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
147e0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
147f0 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
14800 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14810 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
14820 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
14830 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
14840 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
14850 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
14860 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
14870 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
14880 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
14890 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
148a0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
148b0 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
148c0 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
148d0 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
148e0 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
148f0 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
14900 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
14910 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
14920 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
14930 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
14940 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
14950 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
14960 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
14970 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
14980 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
14990 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
149a0 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
149b0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
149c0 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
149d0 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
149e0 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
149f0 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
14a00 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
14a10 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
14a20 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
14a30 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
14a40 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
14a50 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
14a60 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
14a70 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
14a80 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
14a90 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
14aa0 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
14ab0 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
14ac0 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
14ad0 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
14ae0 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
14af0 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
14b00 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
14b10 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
14b20 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
14b30 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
14b40 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
14b50 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
14b60 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
14b70 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
14b80 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
14b90 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
14ba0 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 73 71  nt wrflag){.  sq
14bb0 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
14bc0 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  0;.  BtShared *p
14bd0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
14be0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14bf0 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
14c00 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
14c10 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
14c20 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
14c30 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
14c40 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
14c50 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
14c60 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
14c70 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
14c80 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
14c90 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
14ca0 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
14cb0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
14cc0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
14cd0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
14ce0 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
14cf0 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
14d00 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
14d10 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
14d20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
14d30 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
14d40 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
14d50 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
14d60 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
14d70 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26  pBt->readOnly &&
14d80 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
14d90 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
14da0 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
14db0 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
14dc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14dd0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14de0 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
14df0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
14e00 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
14e10 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
14e20 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
14e30 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
14e40 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
14e50 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
14e60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
14e70 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
14e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
14e90 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
14ea0 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
14eb0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
14ec0 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20 70  RANS_WRITE) || p
14ed0 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b  Bt->isPending ){
14ee0 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42  .    pBlock = pB
14ef0 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
14f00 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c    }else if( wrfl
14f10 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f  ag>1 ){.    BtLo
14f20 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66  ck *pIter;.    f
14f30 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
14f40 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
14f50 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
14f60 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
14f70 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20  ->pBtree!=p ){. 
14f80 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20         pBlock = 
14f90 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64  pIter->pBtree->d
14fa0 62 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  b;.        break
14fb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14fc0 20 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b    }.  if( pBlock
14fd0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
14fe0 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
14ff0 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
15000 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15010 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
15020 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  CHE;.    goto tr
15030 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23  ans_begun;.  }.#
15040 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
15050 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
15060 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
15070 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
15080 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
15090 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
150a0 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
150b0 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
150c0 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
150d0 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
150e0 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
150f0 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
15100 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
15110 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
15120 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
15130 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
15140 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
15150 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
15160 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
15170 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69 74 69 61  ;..  pBt->initia
15180 6c 6c 79 45 6d 70 74 79 20 3d 20 28 75 38 29 28  llyEmpty = (u8)(
15190 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 29 3b 0a  pBt->nPage==0);.
151a0 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61    do {.    /* Ca
151b0 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75  ll lockBtree() u
151c0 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d  ntil either pBt-
151d0 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c  >pPage1 is popul
151e0 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c  ated or.    ** l
151f0 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72  ockBtree() retur
15200 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ns something oth
15210 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f  er than SQLITE_O
15220 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20  K. lockBtree(). 
15230 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e     ** may return
15240 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
15250 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
15260 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74   set to 0 if aft
15270 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  er.    ** readin
15280 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63  g page 1 it disc
15290 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70  overs that the p
152a0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
152b0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
152c0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74   file is not pBt
152d0 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74  ->pageSize. In t
152e0 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72  his case lockBtr
152f0 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65  ee() will update
15300 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67  .    ** pBt->pag
15310 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67  eSize to the pag
15320 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e-size of the fi
15330 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20  le on disk..    
15340 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42  */.    while( pB
15350 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20  t->pPage1==0 && 
15360 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
15370 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29   lockBtree(pBt))
15380 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d   );..    if( rc=
15390 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
153a0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66  flag ){.      if
153b0 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  ( pBt->readOnly 
153c0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
153d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
153e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
153f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
15400 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
15410 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
15420 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
15430 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
15440 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
15450 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15460 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
15470 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
15480 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15490 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
154a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
154b0 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
154c0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
154d0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
154e0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
154f0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
15500 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
15510 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
15520 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
15530 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
15540 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  t) );..  if( rc=
15550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15560 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15570 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
15580 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
15590 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
155a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
155b0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
155c0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
155d0 65 20 29 7b 0a 09 61 73 73 65 72 74 28 20 70 2d  e ){..assert( p-
155e0 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
155f0 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
15600 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
15610 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
15620 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
15630 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
15640 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
15650 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
15660 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
15670 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
15680 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
15690 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
156a0 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
156b0 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
156c0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
156d0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
156e0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
156f0 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
15700 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
15710 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
15720 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
15730 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
15740 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15750 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
15760 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
15770 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
15780 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
15790 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
157a0 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65  pBt->isExclusive
157b0 20 3d 20 28 75 38 29 28 77 72 66 6c 61 67 3e 31   = (u8)(wrflag>1
157c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  );.#endif..     
157d0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
157e0 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
157f0 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
15800 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
15810 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
15820 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
15830 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
15840 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
15850 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
15860 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
15870 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
15880 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
15890 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
158a0 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
158b0 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
158c0 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
158d0 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
158e0 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
158f0 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
15900 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
15910 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
15920 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
15930 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
15940 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
15950 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
15960 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
15970 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15980 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
15990 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
159a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
159b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
159c0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
159d0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
159e0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
159f0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15a00 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
15a10 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
15a20 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
15a30 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
15a40 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
15a50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
15a60 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
15a70 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
15a80 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
15a90 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
15aa0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
15ab0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
15ac0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
15ad0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
15ae0 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
15af0 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
15b00 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
15b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15b20 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
15b30 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
15b40 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
15b50 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
15b60 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
15b70 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15b80 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
15b90 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
15ba0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15bb0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
15bc0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
15bd0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
15be0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
15bf0 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
15c00 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
15c10 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
15c20 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
15c30 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
15c40 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
15c50 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
15c60 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
15c70 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
15c80 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
15c90 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
15ca0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
15cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
15cd0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
15ce0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15d10 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
15d20 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
15d30 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15d50 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
15d60 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15d70 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
15d80 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
15d90 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
15da0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
15db0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
15dc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15dd0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
15de0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
15df0 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
15e00 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
15e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15e20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
15e30 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
15e40 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
15e50 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
15e60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
15e70 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
15e80 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
15e90 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
15ea0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
15eb0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
15ec0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
15ed0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
15ee0 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
15ef0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
15f00 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
15f10 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
15f20 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
15f30 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
15f40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
15f50 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
15f60 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
15f70 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
15f80 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
15f90 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
15fa0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
15fb0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
15fc0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
15fd0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
15fe0 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
15ff0 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
16000 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
16010 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
16020 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
16030 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
16040 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
16050 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
16060 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
16070 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
16080 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
16090 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
160a0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
160b0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
160c0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
160d0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
160e0 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
160f0 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
16100 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
16110 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
16120 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
16150 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
16160 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
16170 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
16180 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
16190 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
161a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
161b0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
161c0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
161d0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
161e0 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
161f0 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
16200 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
16210 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
16220 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
16230 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
16240 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
16250 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
16260 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
16270 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
16280 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
16290 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
162a0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
162b0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
162c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
162d0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
162e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
162f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
16300 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
16310 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
16320 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
16330 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
16340 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
16350 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
16360 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16370 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
16380 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
16390 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
163a0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
163b0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
163c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
163d0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
163e0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
163f0 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
16400 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
16410 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
16420 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
16430 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
16440 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e  ll;..    btreeIn
16450 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
16460 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
16470 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
16480 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
16490 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
164a0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
164b0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
164c0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
164d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
164e0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
164f0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
16500 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
16510 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
16520 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
16530 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  if( info.iOverfl
16540 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
16550 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62  if( iFrom==get4b
16560 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
16570 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20  iOverflow]) ){. 
16580 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
16590 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
165a0 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
165b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
165c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
165d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
165e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
165f0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
16600 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
16610 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
16620 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
16630 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
16650 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
16660 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
16670 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
16680 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
16690 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
166a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
166b0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
166c0 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
166d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
166e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
166f0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
16700 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
16710 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
16720 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
16730 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  o);.    }..    p
16740 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
16750 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20  sInitOrig;.  }. 
16760 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16770 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  K;.}.../*.** Mov
16780 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  e the open datab
16790 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
167a0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72   to location iFr
167b0 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  eePage in the .*
167c0 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20  * database. The 
167d0 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63  pDbPage referenc
167e0 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e  e remains valid.
167f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d  .**.** The isCom
16800 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74  mit flag indicat
16810 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
16820 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
16830 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65  mber that.** the
16840 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74   journal needs t
16850 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65  o be sync()ed be
16860 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61  fore database pa
16870 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  ge pDbPage->pgno
16880 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74   .** can be writ
16890 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
168a0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
168b0 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
168c0 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20  rite to that.** 
168d0 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
168e0 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
168f0 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
16900 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
16910 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
16920 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
16930 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
16940 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
16950 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
16960 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
16970 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
16980 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
16990 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
169a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
169b0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
169c0 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
169d0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
169e0 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
169f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
16a00 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
16a10 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
16a20 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20  t isCommit      
16a30 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d         /* isComm
16a40 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74  it flag passed t
16a50 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  o sqlite3PagerMo
16a60 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d  vepage */.){.  M
16a70 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
16a80 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
16a90 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
16aa0 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
16ab0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
16ac0 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
16ad0 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
16ae0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
16af0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
16b00 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
16b10 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
16b20 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
16b30 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
16b40 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
16b50 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
16b60 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
16b70 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
16b80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16b90 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
16ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
16bb0 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
16bc0 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
16bd0 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
16be0 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
16bf0 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
16c00 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
16c10 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
16c20 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
16c30 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
16c40 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
16c50 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
16c60 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
16c70 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
16c80 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
16c90 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
16ca0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
16cb0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
16cc0 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
16cd0 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
16ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16cf0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
16d00 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
16d10 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
16d20 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
16d30 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
16d40 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
16d50 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
16d60 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
16d70 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
16d80 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
16d90 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
16da0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
16db0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
16dc0 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
16dd0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
16de0 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
16df0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
16e00 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
16e10 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
16e20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
16e30 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
16e40 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
16e50 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
16e60 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
16e70 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
16e80 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
16e90 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
16ea0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
16eb0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
16ec0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
16ed0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
16ee0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
16ef0 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
16f00 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
16f10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16f20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
16f30 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16f40 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
16f50 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
16f60 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
16f70 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
16f80 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
16f90 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
16fa0 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41   nextOvfl, PTRMA
16fb0 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72  P_OVERFLOW2, iFr
16fc0 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  eePage, &rc);.  
16fd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17000 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
17010 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
17020 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
17030 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
17040 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
17050 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
17060 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
17070 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
17080 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
17090 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
170a0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
170b0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
170c0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
170d0 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
170e0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
170f0 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
17100 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
17110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17120 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17130 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
17140 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
17150 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
17160 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
17170 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17180 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
17190 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
171a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
171b0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
171c0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
171d0 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
171e0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
171f0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
17200 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
17210 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
17220 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72  _OK ){.      ptr
17230 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65  mapPut(pBt, iFre
17240 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50  ePage, eType, iP
17250 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20  trPage, &rc);.  
17260 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17270 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
17280 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
17290 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
172a0 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
172b0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
172c0 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
172d0 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
172e0 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
172f0 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
17300 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
17310 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
17320 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
17330 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
17340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17350 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
17360 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
17370 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
17380 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
17390 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
173a0 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
173b0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
173c0 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
173d0 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
173e0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
173f0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
17400 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
17410 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
17420 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
17430 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
17440 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
17450 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
17460 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
17470 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
17480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73  his function ass
17490 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  umes.** that the
174a0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
174b0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
174c0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
174d0 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53  .** it returns S
174e0 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
174f0 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74   error, and that
17500 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20   nFin is the.** 
17510 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
17520 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17530 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61  e will contain a
17540 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72  fter this .** pr
17550 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74  ocess is complet
17560 65 2e 20 20 49 66 20 6e 46 69 6e 20 69 73 20 7a  e.  If nFin is z
17570 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
17580 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e 63 72 56  ed that.** incrV
17590 61 63 75 75 6d 53 74 65 70 28 29 20 77 69 6c 6c  acuumStep() will
175a0 20 62 65 20 63 61 6c 6c 65 64 20 61 20 66 69 6e   be called a fin
175b0 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  ite amount of ti
175c0 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20 6d 61 79  mes.** which may
175d0 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65 6d 70 74   or may not empt
175e0 79 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  y the freelist. 
175f0 20 41 20 66 75 6c 6c 20 61 75 74 6f 76 61 63 75   A full autovacu
17600 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69 6e 3e 30  um.** has nFin>0
17610 2e 20 20 41 20 22 50 52 41 47 4d 41 20 69 6e 63  .  A "PRAGMA inc
17620 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 22  remental_vacuum"
17630 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e 0a 2a 2f   has nFin==0..*/
17640 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
17650 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
17660 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
17670 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
17680 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65  g){.  Pgno nFree
17690 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
176a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
176b0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
176c0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69  free-list */.  i
176d0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
176e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
176f0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
17700 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c   );.  assert( iL
17710 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20  astPg>nFin );.. 
17720 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50   if( !PTRMAP_ISP
17730 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
17740 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45  ) && iLastPg!=PE
17750 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
17760 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65  pBt) ){.    u8 e
17770 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
17780 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
17790 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
177a0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
177b0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
177c0 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
177d0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
177e0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
177f0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
17800 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
17810 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
17820 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
17830 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17840 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17850 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
17860 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
17870 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
17880 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17890 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
178a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
178b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
178c0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
178d0 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
178e0 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
178f0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
17900 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
17910 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
17920 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
17930 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
17940 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
17950 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
17960 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
17970 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
17980 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
17990 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
179a0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
179b0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
179c0 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
179d0 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
179e0 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
179f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
17a00 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
17a10 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
17a20 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
17a30 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
17a40 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
17a50 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
17a60 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
17a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17a90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17aa0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
17ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
17ac0 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
17ad0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
17ae0 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
17af0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
17b00 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
17b10 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
17b20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
17b30 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
17b40 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
17b50 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
17b60 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
17b70 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
17b80 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
17b90 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
17ba0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17bb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17bc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17bd0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
17be0 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68  nFin is zero, th
17bf0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
17c00 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
17c10 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
17c20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
17c30 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
17c40 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
17c50 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
17c60 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
17c70 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
17c80 20 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69   hand, if nFin i
17c90 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
17ca0 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
17cb0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
17cc0 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
17cd0 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
17ce0 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
17cf0 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
17d00 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
17d10 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
17d20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
17d30 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
17d40 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
17d50 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
17d60 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
17d70 20 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29   &iFreePg, 0, 0)
17d80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17d90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17da0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
17db0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
17dc0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17dd0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
17de0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
17df0 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
17e00 20 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d    }while( nFin!=
17e10 30 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  0 && iFreePg>nFi
17e20 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
17e30 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
17e40 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
17e50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
17e60 61 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50  agerWrite(pLastP
17e70 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
17e80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17e90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17ea0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
17eb0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
17ec0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
17ed0 20 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d   iFreePg, nFin!=
17ee0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
17ef0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
17f00 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
17f10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17f20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17f30 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
17f40 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e    }.  }..  if( n
17f50 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c  Fin==0 ){.    iL
17f60 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69  astPg--;.    whi
17f70 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e  le( iLastPg==PEN
17f80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
17f90 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41  Bt)||PTRMAP_ISPA
17fa0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
17fb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54   ){.      if( PT
17fc0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
17fd0 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20   iLastPg) ){.   
17fe0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
17ff0 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
18000 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
18010 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50 67 2c  , iLastPg, &pPg,
18020 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
18030 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18040 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
18050 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
18060 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18070 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
18080 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
18090 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
180a0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ge(pPg);.       
180b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
180c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
180d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
180e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
180f0 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20     iLastPg--;.  
18100 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
18110 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
18120 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  e(pBt->pPager, i
18130 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 70 42 74  LastPg);.    pBt
18140 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
18150 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
18160 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18170 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
18180 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
18190 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
181a0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
181b0 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
181c0 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
181d0 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
181e0 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
181f0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
18200 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
18210 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
18220 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
18230 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
18240 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
18250 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
18260 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
18270 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
18280 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
18290 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
182a0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
182b0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
182c0 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
182d0 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
182e0 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
182f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
18300 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18310 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
18320 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
18330 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
18340 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
18350 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
18360 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
18370 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
18380 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
18390 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
183a0 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
183b0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
183c0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
183d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
183e0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
183f0 30 2c 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  0, btreePagecoun
18400 74 28 70 42 74 29 29 3b 0a 20 20 20 20 69 66 28  t(pBt));.    if(
18410 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18420 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18430 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
18440 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
18450 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
18460 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18470 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
18480 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
18490 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
184a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
184b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
184c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
184d0 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
184e0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
184f0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
18500 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
18510 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
18520 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
18530 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
18540 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
18550 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
18560 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
18570 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18580 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
18590 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
185a0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
185b0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
185c0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
185d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
185e0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
185f0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
18600 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
18610 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
18620 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
18630 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
18640 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
18650 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
18660 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
18670 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
18680 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
18690 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
186a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
186b0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
186c0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
186d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
186e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
186f0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
18700 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
18710 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
18720 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
18730 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
18740 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
18750 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
18760 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
18770 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
18780 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
18790 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
187a0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
187b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
187c0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
187d0 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
187e0 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20  Pgno nPtrmap;   
187f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18800 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20  PtrMap pages to 
18810 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20  be freed */.    
18820 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
18830 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
18840 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
18850 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 6e 74 72  */.    int nEntr
18860 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  y;        /* Num
18870 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
18880 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
18890 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  e */.    Pgno nO
188a0 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
188b0 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
188c0 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
188d0 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
188e0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
188f0 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
18900 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
18910 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
18920 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18930 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
18940 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
18950 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
18960 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
18970 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
18980 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
18990 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
189a0 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
189b0 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
189c0 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
189d0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
189e0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
189f0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
18a00 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
18a10 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18a20 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
18a30 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
18a40 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18a50 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
18a60 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75   nEntry = pBt->u
18a70 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 20  sableSize/5;.   
18a80 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
18a90 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
18aa0 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
18ab0 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
18ac0 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ;.    nFin = nOr
18ad0 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
18ae0 72 6d 61 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f  rmap;.    if( nO
18af0 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45  rig>PENDING_BYTE
18b00 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46  _PAGE(pBt) && nF
18b10 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  in<PENDING_BYTE_
18b20 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
18b30 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
18b40 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
18b50 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
18b60 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
18b70 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18b80 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46  pBt) ){.      nF
18b90 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  in--;.    }.    
18ba0 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29  if( nFin>nOrig )
18bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
18bc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20  ORRUPT_BKPT;..  
18bd0 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
18be0 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
18bf0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
18c00 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
18c10 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
18c20 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
18c30 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Free);.    }.   
18c40 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
18c50 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
18c60 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
18c70 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
18c80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
18c90 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
18ca0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18cb0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
18cc0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
18cd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
18ce0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
18cf0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
18d00 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
18d10 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
18d20 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
18d30 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
18d40 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
18d50 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46  (pBt->pPager, nF
18d60 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  in);.      pBt->
18d70 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
18d80 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
18d90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18da0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
18db0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
18dc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
18dd0 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
18de0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
18df0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
18e00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
18e10 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
18e20 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18e30 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
18e40 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
18e50 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
18e60 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
18e70 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
18e80 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
18e90 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
18ea0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
18eb0 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
18ec0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
18ed0 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
18ee0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
18ef0 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
18f00 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
18f10 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
18f20 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
18f30 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
18f40 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
18f50 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
18f60 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
18f70 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
18f80 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
18f90 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
18fa0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
18fb0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
18fc0 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
18fd0 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
18fe0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
18ff0 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
19000 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
19010 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
19020 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
19030 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
19040 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
19050 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
19060 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
19070 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
19080 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
19090 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
190a0 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
190b0 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
190c0 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
190d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
190e0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
190f0 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
19100 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
19110 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
19120 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
19130 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
19140 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
19150 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
19160 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
19170 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
19180 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
19190 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
191a0 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
191b0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
191c0 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
191d0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
191e0 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
191f0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
19200 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
19210 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
19220 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
19230 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
19240 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
19250 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
19260 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19270 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
19280 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
19290 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
192a0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
192b0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
192c0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
192d0 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
192e0 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
192f0 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
19300 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
19310 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
19320 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
19330 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
19340 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
19350 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
19360 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
19370 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
19380 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
19390 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
193a0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
193b0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
193c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
193d0 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
193e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
193f0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
19400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
19410 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
19420 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
19430 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
19440 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
19450 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19460 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19470 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
19480 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
19490 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
194a0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
194b0 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
194c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
194d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
194e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
194f0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
19500 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
19510 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
19520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
19530 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
19540 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
19550 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
19560 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
19570 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
19580 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19590 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
195a0 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f  s called from bo
195b0 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  th BtreeCommitPh
195c0 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72  aseTwo() and Btr
195d0 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  eeRollback().** 
195e0 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
195f0 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  n of a transacti
19600 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
19610 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  id btreeEndTrans
19620 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29  action(Btree *p)
19630 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
19640 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
19650 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
19660 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
19670 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c 65 61 72  );..  btreeClear
19680 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
19690 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
196a0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  s>TRANS_NONE && 
196b0 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65 56 64 62  p->db->activeVdb
196c0 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  eCnt>1 ){.    /*
196d0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
196e0 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
196f0 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
19700 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
19710 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
19720 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
19730 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
19740 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
19750 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
19760 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
19770 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
19780 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
19790 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
197a0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
197b0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
197c0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
197d0 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
197e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
197f0 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
19800 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
19810 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
19820 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
19830 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
19840 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
19850 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
19860 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
19870 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
19880 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
19890 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
198a0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
198b0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
198c0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
198d0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
198e0 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
198f0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
19900 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
19910 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
19920 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
19930 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
19940 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
19950 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
19960 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
19970 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
19980 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
19990 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
199a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
199b0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
199c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
199d0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
199e0 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
199f0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
19a00 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
19a10 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
19a20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
19a30 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
19a40 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
19a50 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
19a60 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
19a70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
19a80 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
19a90 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
19aa0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
19ab0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
19ac0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
19ad0 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
19ae0 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
19af0 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
19b00 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
19b10 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
19b20 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
19b30 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
19b40 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
19b50 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
19b60 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
19b70 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
19b80 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
19b90 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
19ba0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
19bb0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
19bc0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
19bd0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
19be0 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
19bf0 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
19c00 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
19c10 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
19c20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
19c30 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
19c40 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
19c50 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
19c60 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
19c70 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
19c80 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
19c90 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
19ca0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
19cb0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
19cc0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
19cd0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
19ce0 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
19cf0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
19d00 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
19d10 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
19d20 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
19d30 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
19d40 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
19d50 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
19d60 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
19d70 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
19d80 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
19d90 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
19da0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
19db0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
19dc0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
19dd0 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
19de0 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
19df0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
19e00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
19e10 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
19e20 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
19e30 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
19e40 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
19e50 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
19e60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
19e70 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
19e80 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
19e90 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
19ea0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
19eb0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
19ec0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
19ed0 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
19ee0 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
19ef0 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
19f00 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
19f10 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
19f20 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
19f30 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
19f40 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
19f50 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
19f60 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
19f70 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
19f80 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
19f90 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
19fa0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
19fb0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19fc0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
19fd0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
19fe0 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
19ff0 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1a000 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1a010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a020 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1a030 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1a040 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1a050 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1a060 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1a070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1a080 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a090 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1a0a0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1a0b0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1a0c0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1a0d0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1a0e0 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1a0f0 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1a100 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1a110 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1a120 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1a130 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1a140 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1a150 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1a160 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1a170 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1a180 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1a190 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1a1a0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1a1b0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1a1c0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1a1d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a1e0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1a1f0 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1a200 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a210 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1a220 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1a230 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a240 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
1a250 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1a260 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a270 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
1a280 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
1a290 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
1a2a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a2b0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1a2c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a2d0 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73  .** Do both phas
1a2e0 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a  es of a commit..
1a2f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a300 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20  reeCommit(Btree 
1a310 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1a320 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a330 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  er(p);.  rc = sq
1a340 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1a350 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a  PhaseOne(p, 0);.
1a360 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a370 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
1a380 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a390 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29  itPhaseTwo(p, 0)
1a3a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
1a3b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a3c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1a3d0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1a3e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1a3f0 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75  mber of write-cu
1a400 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
1a410 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  is handle. This 
1a420 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
1a430 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
1a440 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
1a450 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
1a460 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
1a470 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
1a480 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
1a490 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
1a4a0 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  e, a write-curso
1a4b0 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
1a4c0 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
1a4d0 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f  le of writing to
1a4e0 20 74 68 65 20 64 61 74 61 62 73 65 2e 20 20 54   the databse.  T
1a4f0 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75  hat means the cu
1a500 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67  rsor was.** orig
1a510 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f  inally opened fo
1a520 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68  r writing and th
1a530 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74  e cursor has not
1a540 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20   be disabled.** 
1a550 62 79 20 68 61 76 69 6e 67 20 69 74 73 20 73 74  by having its st
1a560 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43  ate changed to C
1a570 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a  URSOR_FAULT..*/.
1a580 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1a590 57 72 69 74 65 43 75 72 73 6f 72 73 28 42 74 53  WriteCursors(BtS
1a5a0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
1a5b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
1a5c0 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
1a5d0 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
1a5e0 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
1a5f0 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
1a600 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c    if( pCur->wrFl
1a610 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ag && pCur->eSta
1a620 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
1a630 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
1a640 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
1a650 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
1a660 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73  utine sets the s
1a670 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46  tate to CURSOR_F
1a680 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72  AULT and the err
1a690 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72  or.** code to er
1a6a0 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20  rCode for every 
1a6b0 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72  cursor on BtShar
1a6c0 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
1a6d0 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a  * references..**
1a6e0 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
1a6f0 20 69 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63   is tripped, inc
1a700 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74  luding cursors t
1a710 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f  hat belong.** to
1a720 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
1a730 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
1a740 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68   happen to be sh
1a750 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63  aring.** the cac
1a760 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
1a770 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a780 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
1a790 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
1a7a0 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75  ccurs..** All cu
1a7b0 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20  rsors using the 
1a7c0 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20  same cache must 
1a7d0 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f  be tripped.** to
1a7e0 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72   prevent them fr
1a7f0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65  om trying to use
1a800 20 74 68 65 20 62 74 72 65 65 20 61 66 74 65 72   the btree after
1a810 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1a820 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  .  The rollback 
1a830 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74 65 64  may have deleted
1a840 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f   tables.** or mo
1a850 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20  ved root pages, 
1a860 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66  so it is not suf
1a870 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61  ficient to.** sa
1a880 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
1a890 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
1a8a0 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a   cursor must be.
1a8b0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  ** invalidated..
1a8c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1a8d0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
1a8e0 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65  rs(Btree *pBtree
1a8f0 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a  , int errCode){.
1a900 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1a910 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a920 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f  er(pBtree);.  fo
1a930 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
1a940 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
1a950 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
1a960 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
1a970 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1a980 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61  (p);.    p->eSta
1a990 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
1a9a0 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65  T;.    p->skipNe
1a9b0 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20  xt = errCode;.  
1a9c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
1a9d0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1a9e0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a9f0 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
1aa00 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69       p->apPage[i
1aa10 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
1aa20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1aa30 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
1aa40 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1aa50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1aa60 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
1aa70 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
1aa80 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
1aa90 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
1aaa0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
1aab0 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
1aac0 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
1aad0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1aae0 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
1aaf0 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
1ab00 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
1ab10 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
1ab20 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
1ab30 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1ab40 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
1ab50 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
1ab60 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
1ab70 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
1ab80 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1ab90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1aba0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
1abb0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
1abc0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1abd0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1abe0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1abf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1ac00 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 61  er(p);.  rc = sa
1ac10 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1ac20 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  , 0, 0);.#ifndef
1ac30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1ac40 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20  RED_CACHE.  if( 
1ac50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ac60 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1ac70 61 20 68 6f 72 72 69 62 6c 65 20 73 69 74 75 61  a horrible situa
1ac80 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d  tion. An IO or m
1ac90 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f 63  alloc() error oc
1aca0 63 75 72 72 65 64 20 77 68 69 6c 73 74 0a 20 20  curred whilst.  
1acb0 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 73    ** trying to s
1acc0 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ave cursor posit
1acd0 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 69 73  ions. If this is
1ace0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 72 6f   an automatic ro
1acf0 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20 20 2a  llback (as.    *
1ad00 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  * the result of 
1ad10 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61  a constraint, ma
1ad20 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 20 6f  lloc() failure o
1ad30 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68 65 6e  r IO error) then
1ad40 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 63   .    ** the cac
1ad50 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65 72 6e  he may be intern
1ad60 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e  ally inconsisten
1ad70 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76  t (not contain v
1ad80 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f 0a 20  alid trees) so. 
1ad90 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20     ** we cannot 
1ada0 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 74 68  simply return th
1adb0 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65 20 63  e error to the c
1adc0 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64 2c 20  aller. Instead, 
1add0 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c  abort .    ** al
1ade0 6c 20 71 75 65 72 69 65 73 20 74 68 61 74 20 6d  l queries that m
1adf0 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e 79 20  ay be using any 
1ae00 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
1ae10 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20 73 61  hat failed to sa
1ae20 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ve..    */.    s
1ae30 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1ae40 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72 63 29  llCursors(p, rc)
1ae50 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62  ;.  }.#endif.  b
1ae60 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1ae70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
1ae80 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1ae90 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
1aea0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
1aeb0 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
1aec0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
1aed0 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
1aee0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1aef0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1af00 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
1af10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1af20 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
1af30 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
1af40 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
1af50 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
1af60 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
1af70 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
1af80 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
1af90 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
1afa0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1afb0 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
1afc0 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
1afd0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
1afe0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
1aff0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
1b000 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b010 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
1b020 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
1b030 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
1b040 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
1b050 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1b060 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
1b070 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
1b080 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
1b090 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
1b0a0 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
1b0b0 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
1b0c0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
1b0d0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
1b0e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
1b0f0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
1b100 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
1b110 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
1b120 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
1b130 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1b140 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
1b150 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1b160 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
1b170 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b180 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b190 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
1b1a0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1b1b0 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
1b1c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
1b1d0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
1b1e0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
1b1f0 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
1b200 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
1b210 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
1b220 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
1b230 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
1b240 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1b250 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1b260 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
1b270 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
1b280 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
1b290 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
1b2a0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
1b2b0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
1b2c0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
1b2d0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
1b2e0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
1b2f0 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
1b300 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
1b310 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
1b320 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
1b330 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
1b340 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
1b350 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
1b360 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
1b370 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
1b380 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
1b390 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
1b3a0 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
1b3b0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
1b3c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1b3d0 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
1b3e0 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
1b3f0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
1b400 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
1b410 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
1b420 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
1b430 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1b440 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
1b450 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
1b460 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
1b470 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
1b480 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1b490 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
1b4a0 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
1b4b0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
1b4c0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
1b4d0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
1b4e0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
1b4f0 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
1b500 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
1b510 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
1b520 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
1b530 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
1b540 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
1b550 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
1b560 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
1b570 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1b580 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
1b590 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
1b5a0 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
1b5b0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1b5c0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1b5d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b5e0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1b5f0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
1b600 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1b610 61 73 73 65 72 74 28 20 70 42 74 2d 3e 72 65 61  assert( pBt->rea
1b620 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  dOnly==0 );.  as
1b630 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
1b640 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1b650 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
1b660 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
1b670 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1b680 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1b690 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
1b6a0 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
1b6b0 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
1b6c0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
1b6d0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
1b6e0 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
1b6f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
1b700 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
1b710 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
1b720 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
1b730 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
1b740 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
1b750 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1b760 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
1b770 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
1b780 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
1b790 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
1b7a0 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
1b7b0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
1b7c0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1b7d0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1b7e0 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
1b7f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b800 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b810 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b820 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
1b830 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
1b840 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
1b850 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
1b860 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
1b870 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
1b880 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
1b890 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
1b8a0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
1b8b0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
1b8c0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
1b8d0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
1b8e0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
1b8f0 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
1b900 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
1b910 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
1b920 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
1b930 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
1b940 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
1b950 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
1b960 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
1b970 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
1b980 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
1b990 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
1b9a0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
1b9b0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
1b9c0 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
1b9d0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
1b9e0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
1b9f0 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
1ba00 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
1ba10 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
1ba20 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
1ba30 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
1ba40 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
1ba50 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
1ba60 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
1ba70 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
1ba80 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
1ba90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1baa0 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
1bab0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1bac0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
1bad0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1bae0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
1baf0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
1bb00 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
1bb10 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
1bb20 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
1bb30 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
1bb40 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
1bb50 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1bb60 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
1bb70 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1bb80 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
1bb90 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
1bba0 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1bbb0 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
1bbc0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1bbd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1bbe0 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
1bbf0 3c 30 20 26 26 20 70 42 74 2d 3e 69 6e 69 74 69  <0 && pBt->initi
1bc00 61 6c 6c 79 45 6d 70 74 79 20 29 20 70 42 74 2d  allyEmpty ) pBt-
1bc10 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >nPage = 0;.    
1bc20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
1bc30 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70  se(pBt);.      p
1bc40 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34  Bt->nPage = get4
1bc50 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70  byte(28 + pBt->p
1bc60 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a  Page1->aData);..
1bc70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1bc80 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20 77  abase size was w
1bc90 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1bca0 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68 65  offset 28 of the
1bcb0 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a   header.      **
1bcc0 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
1bcd0 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73  ction started, s
1bce0 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
1bcf0 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73  he value at offs
1bd00 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69  et.      ** 28 i
1bd10 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20  s nonzero. */.  
1bd20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1bd30 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  >nPage>0 );.    
1bd40 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
1bd50 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
1bd60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bd70 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
1bd80 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
1bd90 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
1bda0 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
1bdb0 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20  e.** iTable. If 
1bdc0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73  a read-only curs
1bdd0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
1bde0 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   it is assumed t
1bdf0 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65  hat.** the calle
1be00 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74  r already has at
1be10 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e   least a read-on
1be20 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ly transaction o
1be30 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61  pen.** on the da
1be40 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20  tabase already. 
1be50 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f  If a write-curso
1be60 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  r is requested, 
1be70 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  then.** the call
1be80 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  er is assumed to
1be90 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72   have an open wr
1bea0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1beb0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
1bec0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
1bed0 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
1bee0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
1bef0 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
1bf00 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
1bf10 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
1bf20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
1bf30 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
1bf40 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
1bf50 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
1bf60 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
1bf70 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
1bf80 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
1bf90 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
1bfa0 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
1bfb0 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
1bfc0 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
1bfd0 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
1bfe0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
1bff0 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
1c000 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
1c010 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
1c020 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
1c030 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
1c040 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
1c050 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
1c060 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
1c070 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
1c080 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
1c090 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
1c0a0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
1c0b0 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
1c0c0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
1c0d0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
1c0e0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
1c0f0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
1c100 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
1c110 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
1c120 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
1c130 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
1c140 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
1c150 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
1c160 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
1c170 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
1c180 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
1c190 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
1c1a0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
1c1b0 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
1c1c0 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
1c1d0 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
1c1e0 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
1c1f0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
1c200 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
1c210 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
1c220 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
1c230 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
1c240 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
1c250 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ly..**.** It is 
1c260 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1c270 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1c280 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65  sorZero() has be
1c290 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20  en called.** on 
1c2a0 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69  pCur to initiali
1c2b0 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70  ze the memory sp
1c2c0 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76  ace prior to inv
1c2d0 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  oking this routi
1c2e0 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
1c2f0 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
1c300 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
1c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c320 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1c330 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1c340 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c360 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
1c370 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
1c380 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
1c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1c3b0 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1c3c0 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1c3d0 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1c3e0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1c3f0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
1c400 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
1c410 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
1c420 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c440 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
1c450 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
1c460 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1c470 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
1c480 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72           /* Shar
1c490 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65  ed b-tree handle
1c4a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
1c4b0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1c4c0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1c4d0 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1c4e0 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a  || wrFlag==1 );.
1c4f0 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1c500 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65  ing assert state
1c510 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61  ments verify tha
1c520 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  t if this is a s
1c530 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d  harable .  ** b-
1c540 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74  tree database, t
1c550 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  he connection is
1c560 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71   holding the req
1c570 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b  uired table lock
1c580 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61  s, .  ** and tha
1c590 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  t no other conne
1c5a0 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
1c5b0 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
1c5c0 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20  onflicts with . 
1c5d0 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20   ** this lock.  
1c5e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73  */.  assert( has
1c5f0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1c600 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20  Lock(p, iTable, 
1c610 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46  pKeyInfo!=0, wrF
1c620 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65  lag+1) );.  asse
1c630 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1c640 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1c650 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b  ts(p, iTable) );
1c660 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
1c670 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  at the caller ha
1c680 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71  s opened the req
1c690 75 69 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f  uired transactio
1c6a0 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  n. */.  assert( 
1c6b0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
1c6c0 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
1c6d0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
1c6e0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1c6f0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
1c700 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
1c710 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
1c720 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28  >aData );..  if(
1c730 20 4e 45 56 45 52 28 77 72 46 6c 61 67 20 26 26   NEVER(wrFlag &&
1c740 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20   pBt->readOnly) 
1c750 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c760 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
1c770 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
1c780 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
1c790 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
1c7a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c7b0 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20  E_EMPTY;.  }..  
1c7c0 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
1c7d0 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
1c7e0 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
1c7f0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
1c800 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
1c810 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
1c820 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
1c830 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
1c840 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
1c850 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
1c860 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
1c870 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
1c880 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
1c890 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
1c8a0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
1c8b0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
1c8c0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
1c8d0 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
1c8e0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
1c8f0 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
1c900 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1c910 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1c920 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
1c930 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
1c940 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
1c950 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1c960 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d  INVALID;.  pCur-
1c970 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30  >cachedRowid = 0
1c980 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c990 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
1c9a0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
1c9b0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
1c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c9e0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
1c9f0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ca20 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
1ca30 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
1ca40 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
1ca70 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
1ca80 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
1ca90 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
1caa0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
1cab0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
1cac0 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
1cad0 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
1cae0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb00 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
1cb10 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
1cb20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1cb30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1cb40 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
1cb50 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
1cb60 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
1cb70 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c  fo, pCur);.  sql
1cb80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1cb90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1cba0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1cbb0 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
1cbc0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
1cbd0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
1cbe0 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
1cbf0 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
1cc00 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
1cc10 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
1cc20 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
1cc30 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
1cc40 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
1cc50 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
1cc60 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
1cc70 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
1cc80 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
1cc90 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
1cca0 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
1ccb0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1ccc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1ccd0 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
1cce0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
1ccf0 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
1cd00 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
1cd10 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
1cd20 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
1cd30 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
1cd40 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1cd50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
1cd60 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
1cd70 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
1cd80 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
1cd90 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
1cda0 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
1cdb0 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
1cdc0 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
1cdd0 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
1cde0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
1cdf0 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
1ce00 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
1ce10 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
1ce20 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
1ce30 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
1ce40 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
1ce50 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
1ce60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ce70 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
1ce80 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
1ce90 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
1cea0 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
1ceb0 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  iPage));.}../*.*
1cec0 2a 20 53 65 74 20 74 68 65 20 63 61 63 68 65 64  * Set the cached
1ced0 20 72 6f 77 69 64 20 76 61 6c 75 65 20 6f 66 20   rowid value of 
1cee0 65 76 65 72 79 20 63 75 72 73 6f 72 20 69 6e 20  every cursor in 
1cef0 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
1cf00 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20 70 43 75  e file.** as pCu
1cf10 72 20 61 6e 64 20 68 61 76 69 6e 67 20 74 68 65  r and having the
1cf20 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65 20   same root page 
1cf30 6e 75 6d 62 65 72 20 61 73 20 70 43 75 72 2e 20  number as pCur. 
1cf40 20 54 68 65 20 76 61 6c 75 65 20 69 73 0a 2a 2a   The value is.**
1cf50 20 73 65 74 20 74 6f 20 69 52 6f 77 69 64 2e 0a   set to iRowid..
1cf60 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f 73 69 74  **.** Only posit
1cf70 69 76 65 20 72 6f 77 69 64 20 76 61 6c 75 65 73  ive rowid values
1cf80 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1cf90 76 61 6c 69 64 20 66 6f 72 20 74 68 69 73 20 63  valid for this c
1cfa0 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20 63 61 63  ache..** The cac
1cfb0 68 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  he is initialize
1cfc0 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e 64 69 63  d to zero, indic
1cfd0 61 74 69 6e 67 20 61 6e 20 69 6e 76 61 6c 69 64  ating an invalid
1cfe0 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20 62 74 72   cache..** A btr
1cff0 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ee will work fin
1d000 65 20 77 69 74 68 20 7a 65 72 6f 20 6f 72 20 6e  e with zero or n
1d010 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 2e 20  egative rowids. 
1d020 20 57 65 20 6a 75 73 74 20 63 61 6e 6e 6f 74 0a   We just cannot.
1d030 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f 20 6f 72  ** cache zero or
1d040 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1d050 2c 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 61  , which means ta
1d060 62 6c 65 73 20 74 68 61 74 20 75 73 65 20 7a 65  bles that use ze
1d070 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61 74 69 76  ro or.** negativ
1d080 65 20 72 6f 77 69 64 73 20 6d 69 67 68 74 20 72  e rowids might r
1d090 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
1d0a0 65 72 2e 20 20 42 75 74 20 69 6e 20 70 72 61 63  er.  But in prac
1d0b0 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tice, zero.** or
1d0c0 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1d0d0 20 61 72 65 20 76 65 72 79 20 75 6e 63 6f 6d 6d   are very uncomm
1d0e0 6f 6e 20 73 6f 20 74 68 69 73 20 73 68 6f 75 6c  on so this shoul
1d0f0 64 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  d not be a probl
1d100 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  em..*/.void sqli
1d110 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
1d120 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20  dRowid(BtCursor 
1d130 2a 70 43 75 72 2c 20 73 71 6c 69 74 65 33 5f 69  *pCur, sqlite3_i
1d140 6e 74 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20  nt64 iRowid){.  
1d150 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66  BtCursor *p;.  f
1d160 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42 74 2d 3e  or(p=pCur->pBt->
1d170 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
1d180 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1d190 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 43   p->pgnoRoot==pC
1d1a0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 20 70  ur->pgnoRoot ) p
1d1b0 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20 3d 20  ->cachedRowid = 
1d1c0 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20 20 61 73  iRowid;.  }.  as
1d1d0 73 65 72 74 28 20 70 43 75 72 2d 3e 63 61 63 68  sert( pCur->cach
1d1e0 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77 69 64 20  edRowid==iRowid 
1d1f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1d200 72 6e 20 74 68 65 20 63 61 63 68 65 64 20 72 6f  rn the cached ro
1d210 77 69 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  wid for the give
1d220 6e 20 63 75 72 73 6f 72 2e 20 20 41 20 6e 65 67  n cursor.  A neg
1d230 61 74 69 76 65 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ative or zero.**
1d240 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e   return value in
1d250 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1d260 20 72 6f 77 69 64 20 63 61 63 68 65 20 69 73 20   rowid cache is 
1d270 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
1d280 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f 72 65 64  ld be.** ignored
1d290 2e 20 20 49 66 20 74 68 65 20 72 6f 77 69 64 20  .  If the rowid 
1d2a0 63 61 63 68 65 20 68 61 73 20 6e 65 76 65 72 20  cache has never 
1d2b0 62 65 66 6f 72 65 20 62 65 65 6e 20 73 65 74 2c  before been set,
1d2c0 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65 72 6f 20   then a.** zero 
1d2d0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d2e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
1d2f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 43 61 63  lite3BtreeGetCac
1d300 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73 6f  hedRowid(BtCurso
1d310 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
1d320 72 6e 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  rn pCur->cachedR
1d330 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  owid;.}../*.** C
1d340 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20  lose a cursor.  
1d350 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  The read lock on
1d360 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1d370 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a  le is released.*
1d380 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
1d390 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64  cursor is closed
1d3a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d3b0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
1d3c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1d3d0 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  {.  Btree *pBtre
1d3e0 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  e = pCur->pBtree
1d3f0 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
1d400 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1d410 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d420 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20   pCur->pBt;.    
1d430 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1d440 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73  r(pBtree);.    s
1d450 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1d460 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1d470 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65    if( pCur->pPre
1d480 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  v ){.      pCur-
1d490 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
1d4a0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1d4b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42   }else{.      pB
1d4c0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
1d4d0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  r->pNext;.    }.
1d4e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e      if( pCur->pN
1d4f0 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75  ext ){.      pCu
1d500 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
1d510 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20  = pCur->pPrev;. 
1d520 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
1d530 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1d540 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1d550 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1d560 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
1d570 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  }.    unlockBtre
1d580 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1d590 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
1d5a0 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72  erflowCache(pCur
1d5b0 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  );.    /* sqlite
1d5c0 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f  3_free(pCur); */
1d5d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1d5e0 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
1d5f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1d600 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1d610 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42   Make sure the B
1d620 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69  tCursor* given i
1d630 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68  n the argument h
1d640 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74  as a valid.** Bt
1d650 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75  Cursor.info stru
1d660 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73  cture.  If it is
1d670 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c   not already val
1d680 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65  id, call.** btre
1d690 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20  eParseCell() to 
1d6a0 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a  fill it in..**.*
1d6b0 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
1d6c0 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68  is a cache of th
1d6d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1d6e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c   the current cel
1d6f0 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73  l..** Using this
1d700 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74   cache reduces t
1d710 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c  he number of cal
1d720 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ls to btreeParse
1d730 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30  Cell()..**.** 20
1d740 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65  07-06-25:  There
1d750 20 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d   is a bug in som
1d760 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53  e versions of MS
1d770 56 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68  VC that cause th
1d780 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f  e.** compiler to
1d790 20 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43   crash when getC
1d7a0 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70  ellInfo() is imp
1d7b0 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61  lemented as a ma
1d7c0 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72  cro..** But ther
1d7d0 65 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62  e is a measureab
1d7e0 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61  le speed advanta
1d7f0 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20  ge to using the 
1d800 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20  macro on gcc.** 
1d810 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69  (when less compi
1d820 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ler optimization
1d830 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f  s like -Os or -O
1d840 30 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74  0 are used and t
1d850 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69  he.** compiler i
1d860 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65  s not doing agre
1d870 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29  ssive inlining.)
1d880 20 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65    So we use a re
1d890 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66  al function.** f
1d8a0 6f 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61  or MSVC and a ma
1d8b0 63 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69  cro for everythi
1d8c0 6e 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74  ng else.  Ticket
1d8d0 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64   #2457..*/.#ifnd
1d8e0 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74  ef NDEBUG.  stat
1d8f0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
1d900 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
1d910 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
1d920 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69  Info info;.    i
1d930 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1d940 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73  >iPage;.    mems
1d950 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
1d960 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
1d970 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  btreeParseCell(p
1d980 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
1d990 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
1d9a0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
1d9b0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
1d9c0 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
1d9d0 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
1d9e0 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
1d9f0 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
1da00 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
1da10 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
1da20 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
1da30 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
1da40 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
1da50 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
1da60 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
1da70 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
1da80 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
1da90 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
1daa0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1dab0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
1dac0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1dad0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
1dae0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
1daf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
1db00 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
1db10 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
1db20 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  fo);.      pCur-
1db30 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
1db40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1db50 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1db60 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
1db70 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74  .#else /* if not
1db80 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f   _MSC_VER */.  /
1db90 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e  * Use a macro in
1dba0 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69   all other compi
1dbb0 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  lers so that the
1dbc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c   function is inl
1dbd0 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ined */.#define 
1dbe0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1dbf0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
1dc30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1dc40 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
1dc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e          \.    in
1dc80 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
1dc90 69 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  iPage;          
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62           \.    b
1dcd0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1dce0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1dcf0 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1dd00 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1dd10 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
1dd20 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
1ddc0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
1de10 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
1de20 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  /..#ifndef NDEBU
1de30 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72  G  /* The next r
1de40 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79  outine used only
1de50 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
1de60 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f   statements */./
1de70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1de80 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74   if the given Bt
1de90 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  Cursor is valid.
1dea0 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72    A valid cursor
1deb0 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20   is one.** that 
1dec0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
1ded0 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69  nting to a row i
1dee0 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20  n a (non-empty) 
1def0 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69  table..** This i
1df00 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e  s a verification
1df10 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1df20 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
1df30 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1df40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1df50 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
1df60 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1df70 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
1df80 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  r && pCur->eStat
1df90 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
1dfa0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45  .}.#endif /* NDE
1dfb0 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  BUG */../*.** Se
1dfc0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1dfd0 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
1dfe0 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
1dff0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
1e000 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
1e010 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
1e020 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
1e030 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
1e040 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
1e050 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
1e060 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
1e070 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
1e080 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
1e090 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
1e0a0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
1e0b0 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
1e0c0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1e0d0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
1e0e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
1e0f0 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e  er must position
1e100 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f   the cursor prio
1e110 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
1e120 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a  is routine..** .
1e130 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e140 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74  cannot fail.  It
1e150 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
1e160 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a  SQLITE_OK.  .*/.
1e170 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1e180 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
1e190 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
1e1a0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
1e1b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1e1c0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1e1d0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
1e1e0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
1e1f0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
1e200 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
1e210 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1e220 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
1e230 44 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a 65 20  D ){.    *pSize 
1e240 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1e250 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1e260 75 72 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ur);.    *pSize 
1e270 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
1e280 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  y;.  }.  return 
1e290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1e2a0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1e2b0 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1e2c0 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1e2d0 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
1e2e0 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
1e2f0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
1e300 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
1e310 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
1e320 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
1e330 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
1e340 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
1e350 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
1e360 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
1e370 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
1e380 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
1e390 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1e3a0 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
1e3b0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e3c0 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
1e3d0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
1e3e0 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
1e3f0 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
1e400 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
1e410 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
1e420 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
1e430 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
1e440 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
1e450 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
1e460 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
1e470 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
1e480 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
1e490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e4a0 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
1e4b0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
1e4c0 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1e4d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e4e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e4f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e500 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e510 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
1e520 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a  o(pCur);.  *pSiz
1e530 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
1e540 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 53  Data;.  return S
1e550 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1e560 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
1e570 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
1e580 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1e590 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
1e5a0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
1e5b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1e5c0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
1e5d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1e5e0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
1e5f0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
1e600 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1e610 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
1e620 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
1e630 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
1e640 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
1e650 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
1e660 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
1e670 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
1e680 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1e690 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
1e6a0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
1e6b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
1e6c0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
1e6d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e6e0 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
1e6f0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1e700 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
1e710 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
1e720 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
1e730 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
1e740 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
1e750 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
1e760 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
1e770 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
1e780 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
1e790 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
1e7a0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
1e7b0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
1e7c0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
1e7d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
1e7e0 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
1e7f0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
1e800 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
1e810 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
1e820 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
1e830 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1e840 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
1e850 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
1e860 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
1e870 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
1e880 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
1e890 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
1e8a0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
1e8b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
1e8c0 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
1e8d0 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
1e8e0 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
1e8f0 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
1e900 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
1e910 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
1e920 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
1e930 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1e940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e950 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e960 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e980 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
1e990 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
1e9a0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
1e9b0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
1e9c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
1e9d0 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
1e9e0 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
1e9f0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
1ea00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1ea10 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
1ea20 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
1ea30 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
1ea40 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
1ea50 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
1ea60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ea70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ea80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1ea90 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1eaa0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
1eab0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1eac0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ead0 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
1eae0 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
1eaf0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1eb00 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
1eb10 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
1eb20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1eb30 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
1eb40 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
1eb50 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
1eb60 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
1eb70 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
1eb80 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
1eb90 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
1eba0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
1ebb0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
1ebc0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
1ebd0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
1ebe0 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
1ebf0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
1ec00 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
1ec10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1ec20 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
1ec30 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
1ec40 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
1ec50 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
1ec60 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1ec70 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
1ec80 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
1ec90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1eca0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
1ecb0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
1ecc0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
1ecd0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
1ece0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
1ecf0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
1ed00 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
1ed10 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
1ed20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ed30 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
1ed40 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
1ed50 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
1ed60 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
1ed70 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
1ed80 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1ed90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1eda0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
1edb0 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
1edc0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
1edd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ede0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
1edf0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1ee00 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30 29  ovfl, &pPage, 0)
1ee10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
1ee20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1ee30 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
1ee40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ee50 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1ee60 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1ee70 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1ee80 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1ee90 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1eea0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1eeb0 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1eec0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1eed0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1eee0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1eef0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1ef00 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1ef10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1ef20 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1ef30 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1ef40 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1ef50 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1ef60 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1ef70 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1ef80 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1ef90 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1efa0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1efb0 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1efc0 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1efd0 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1efe0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1eff0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1f000 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1f010 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1f020 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1f030 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1f040 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1f050 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1f060 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1f070 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1f080 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1f090 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1f0a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1f0b0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1f0c0 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1f0d0 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1f0e0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1f0f0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1f100 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1f110 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1f120 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1f130 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1f140 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1f150 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1f160 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1f170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f180 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1f190 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1f1a0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1f1b0 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1f1c0 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1f1d0 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1f1e0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1f1f0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1f200 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1f210 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1f220 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1f230 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1f240 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1f250 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1f260 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1f270 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1f280 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1f290 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1f2a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f2b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f2c0 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1f2d0 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1f2e0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1f2f0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1f300 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1f310 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1f320 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1f330 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1f340 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1f350 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1f360 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1f370 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f380 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1f390 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1f3a0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1f3b0 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1f3c0 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1f3d0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1f3e0 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1f3f0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1f400 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1f410 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1f420 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1f430 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1f440 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1f450 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1f460 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1f470 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1f480 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1f490 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1f4a0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1f4b0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1f4c0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1f4d0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1f4e0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1f4f0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
1f500 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
1f510 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
1f520 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
1f530 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
1f540 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
1f550 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
1f560 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
1f570 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1f580 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1f590 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1f5a0 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1f5b0 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1f5c0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1f5d0 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1f5e0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1f5f0 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1f600 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1f610 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1f620 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1f630 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1f640 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1f650 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1f660 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1f670 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1f680 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1f690 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1f6a0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1f6b0 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1f6c0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1f6d0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1f6e0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1f6f0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1f700 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1f710 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1f720 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1f730 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1f740 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1f750 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1f760 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1f770 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1f780 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1f790 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1f7a0 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1f7b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1f7c0 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1f7d0 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1f7e0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1f7f0 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1f800 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1f810 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1f820 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1f830 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1f840 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1f850 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1f860 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1f870 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1f880 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1f890 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1f8a0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1f8b0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1f8c0 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1f8d0 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1f8e0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1f8f0 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1f900 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1f910 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1f920 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1f930 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1f940 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1f950 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1f960 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f  fer */ .  int eO
1f970 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
1f980 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
1f990 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
1f9a0 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
1f9b0 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
1f9c0 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
1f9d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20  QLITE_OK;.  u32 
1f9e0 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78  nKey;.  int iIdx
1f9f0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1fa00 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
1fa10 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1fa20 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67  e]; /* Btree pag
1fa30 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
1fa40 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
1fa50 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1fa60 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1fa70 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
1fa80 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
1fa90 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74   to */..  assert
1faa0 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ( pPage );.  ass
1fab0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1fac0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1fad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1fae0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1faf0 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
1fb00 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
1fb10 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1fb20 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
1fb30 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1fb40 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
1fb50 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20  r->info.pCell + 
1fb60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
1fb70 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50  er;.  nKey = (pP
1fb80 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20  age->intKey ? 0 
1fb90 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  : (int)pCur->inf
1fba0 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20  o.nKey);..  if( 
1fbb0 4e 45 56 45 52 28 6f 66 66 73 65 74 2b 61 6d 74  NEVER(offset+amt
1fbc0 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
1fbd0 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20 20 7c 7c  fo.nData) .   ||
1fbe0 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
1fbf0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
1fc00 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
1fc10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
1fc20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
1fc30 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
1fc40 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
1fc50 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
1fc60 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
1fc70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1fc80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
1fc90 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
1fca0 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
1fcb0 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
1fcc0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
1fcd0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
1fce0 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
1fcf0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
1fd00 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1fd10 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
1fd20 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1fd30 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
1fd40 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
1fd50 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
1fd60 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
1fd70 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
1fd80 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
1fd90 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
1fda0 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
1fdb0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
1fdc0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
1fdd0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
1fde0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
1fdf0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
1fe00 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1fe10 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
1fe20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
1fe30 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
1fe40 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
1fe50 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
1fe60 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
1fe70 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
1fe80 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
1fe90 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1fea0 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
1feb0 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23  nfo.nLocal]);..#
1fec0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fed0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1fee0 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72  /* If the isIncr
1fef0 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20  blobHandle flag 
1ff00 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42  is set and the B
1ff10 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1ff20 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  w[].    ** has n
1ff30 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
1ff40 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
1ff50 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73  ow. The array is
1ff60 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a   sized at.    **
1ff70 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
1ff80 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
1ff90 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
1ffa0 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20  w chain. The.   
1ffb0 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20   ** page number 
1ffc0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
1ffd0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74  rflow page is st
1ffe0 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
1fff0 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63  w[0],.    ** etc
20000 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
20010 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
20020 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e  ] array means "n
20030 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20  ot yet known".  
20040 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20    ** (the cache 
20050 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
20060 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
20070 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63   if( pCur->isInc
20080 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21  rblobHandle && !
20090 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
200a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76  ){.      int nOv
200b0 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f  fl = (pCur->info
200c0 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e  .nPayload-pCur->
200d0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c  info.nLocal+ovfl
200e0 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65  Size-1)/ovflSize
200f0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
20100 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20  verflow = (Pgno 
20110 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
20120 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29  ero(sizeof(Pgno)
20130 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 2f  *nOvfl);.      /
20140 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c 77 61 79  * nOvfl is alway
20150 73 20 70 6f 73 69 74 69 76 65 2e 20 20 49 66 20  s positive.  If 
20160 69 74 20 77 65 72 65 20 7a 65 72 6f 2c 20 66 65  it were zero, fe
20170 74 63 68 50 61 79 6c 6f 61 64 20 77 6f 75 6c 64  tchPayload would
20180 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 62   have.      ** b
20190 65 65 6e 20 75 73 65 64 20 69 6e 73 74 65 61 64  een used instead
201a0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
201b0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 41  . */.      if( A
201c0 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20 26 26 20  LWAYS(nOvfl) && 
201d0 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
201e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
201f0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20210 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
20220 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
20230 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
20240 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
20250 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
20260 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
20270 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
20280 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
20290 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
202a0 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
202b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
202c0 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
202d0 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
202e0 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
202f0 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
20300 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
20310 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
20320 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
20330 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
20340 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
20350 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65  lSize);.    }.#e
20360 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b  ndif..    for( ;
20370 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20380 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
20390 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23  age; iIdx++){..#
203a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
203b0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
203c0 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
203d0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
203e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
203f0 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
20400 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
20410 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
20420 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
20430 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
20440 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
20450 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
20460 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
20470 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
20480 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
20490 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
204a0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
204b0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
204c0 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
204d0 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
204e0 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
204f0 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
20500 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
20510 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
20520 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
20530 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
20540 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
20550 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
20560 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
20570 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
20580 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
20590 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
205a0 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
205b0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
205c0 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
205d0 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
205e0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
205f0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
20600 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
20610 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
20620 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
20630 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
20640 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
20650 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
20660 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
20670 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
20680 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a   } else .#endif.
20690 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
206a0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
206b0 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
206c0 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
206d0 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
206e0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
206f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
20700 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
20710 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
20720 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
20730 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
20740 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
20750 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
20760 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
20770 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
20780 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  0)..        */. 
20790 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
207a0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
207b0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
207c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
207d0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
207e0 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
207f0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
20800 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
20810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
20820 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
20830 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
20840 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
20850 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
20860 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
20870 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ad);.          i
20880 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
20890 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
208a0 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
208b0 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
208c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
208d0 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
208e0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
208f0 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
20900 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
20910 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
20920 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
20930 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
20940 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
20950 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20           amt -= 
20960 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  a;.          pBu
20970 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  f += a;.        
20980 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
20990 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
209a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
209b0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
209c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
209d0 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
209e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
209f0 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
20a00 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
20a10 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
20a20 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
20a30 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
20a40 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
20a50 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
20a60 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
20a70 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
20a80 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
20a90 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20  ust ensure that 
20aa0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
20ab0 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 0a   to a valid row.
20ac0 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ** in the table.
20ad0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
20ae0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
20af0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
20b00 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
20b10 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
20b20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
20b30 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
20b40 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
20b50 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
20b60 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
20b70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20b80 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
20b90 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
20ba0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
20bb0 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
20bc0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20bd0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20be0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20bf0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20c00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
20c10 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
20c20 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20c30 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
20c40 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
20c50 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
20c60 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20c70 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
20c80 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
20c90 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
20ca0 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
20cb0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
20cc0 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
20cd0 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
20ce0 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64   data associated
20cf0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
20d00 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
20d10 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
20d20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
20d30 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
20d40 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
20d50 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
20d60 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
20d70 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
20d80 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
20d90 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
20da0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
20db0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
20dc0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
20dd0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
20de0 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
20df0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
20e00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20e10 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70  Data(BtCursor *p
20e20 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
20e30 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
20e40 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
20e50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20e60 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
20e70 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61   if ( pCur->eSta
20e80 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
20e90 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ID ){.    return
20ea0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20   SQLITE_ABORT;. 
20eb0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
20ec0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
20ed0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
20ee0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
20ef0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
20f00 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20f10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
20f20 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
20f30 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
20f40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20f50 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
20f60 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
20f70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
20f80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
20f90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
20fa0 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
20fb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
20fc0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
20fd0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
20fe0 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
20ff0 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , pBuf, 0);.  }.
21000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21010 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
21020 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61  ointer to payloa
21030 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  d information fr
21040 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  om the entry tha
21050 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63  t the .** pCur c
21060 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
21070 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74  g to.  The point
21080 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67  er is to the beg
21090 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65  inning of.** the
210a0 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d   key if skipKey=
210b0 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73  =0 and it points
210c0 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
210d0 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20  g of data if.** 
210e0 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65  skipKey==1.  The
210f0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
21100 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65   of available ke
21110 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
21120 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  n.** into *pAmt.
21130 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
21140 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  hen the value re
21150 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
21160 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f  be.** a valid po
21170 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
21180 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
21190 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
211a0 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
211b0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
211c0 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
211d0 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
211e0 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
211f0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
21200 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
21210 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
21220 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
21230 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
21240 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
21250 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
21260 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
21270 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
21280 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
21290 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
212a0 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
212b0 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
212c0 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
212d0 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
212e0 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
212f0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
21300 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
21310 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
21320 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
21330 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
21340 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
21350 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
21360 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
21370 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
21380 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
21390 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
213a0 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
213b0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
213c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
213d0 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63  igned char *fetc
213e0 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
213f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
21400 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
21410 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
21420 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
21430 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20  nt *pAmt,       
21440 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
21450 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
21460 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
21470 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79  */.  int skipKey
21480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61            /* rea
21490 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64  d beginning at d
214a0 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
214b0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  rue */.){.  unsi
214c0 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c  gned char *aPayl
214d0 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  oad;.  MemPage *
214e0 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65  pPage;.  u32 nKe
214f0 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b  y;.  u32 nLocal;
21500 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
21510 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
21520 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
21530 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21540 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
21550 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21560 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
21570 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
21580 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
21590 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
215a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
215b0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
215c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
215d0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
215e0 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e  nCell );.  if( N
215f0 45 56 45 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  EVER(pCur->info.
21600 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20  nSize==0) ){.   
21610 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
21620 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21630 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  r->iPage], pCur-
21640 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21650 67 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ge],.           
21660 20 20 20 20 20 20 20 20 26 70 43 75 72 2d 3e 69          &pCur->i
21670 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79  nfo);.  }.  aPay
21680 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
21690 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
216a0 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
216b0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
216c0 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
216d0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
216e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
216f0 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
21700 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
21710 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
21720 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
21730 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
21740 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
21750 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
21760 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
21770 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
21780 63 61 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  cal;.    assert(
21790 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b   nLocal<=nKey );
217a0 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
217b0 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
217c0 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
217d0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
217e0 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
217f0 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
21800 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
21810 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
21820 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
21830 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
21840 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
21850 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
21860 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
21870 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
21880 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
21890 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
218a0 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
218b0 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
218c0 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
218d0 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
218e0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
218f0 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
21900 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
21910 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
21920 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
21930 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
21940 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
21950 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
21960 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
21970 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
21980 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
21990 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
219a0 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
219b0 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
219c0 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
219d0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
219e0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
219f0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
21a00 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
21a10 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
21a20 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
21a30 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
21a40 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
21a50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20  const void *p = 
21a60 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
21a70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21a80 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
21a90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
21aa0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
21ab0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21ac0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
21ad0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21ae0 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
21af0 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  p = (const void*
21b00 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
21b10 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20  ur, pAmt, 0);.  
21b20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
21b30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
21b40 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74 63  te3BtreeDataFetc
21b50 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
21b60 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
21b70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 20 3d 20  const void *p = 
21b80 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  0;.  assert( sql
21b90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
21ba0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
21bb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
21bc0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
21bd0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
21be0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
21bf0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21c00 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
21c10 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  p = (const void*
21c20 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
21c30 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
21c40 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
21c50 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
21c60 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
21c70 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
21c80 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
21c90 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
21ca0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
21cb0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
21cc0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a  to move to..**.*
21cd0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
21ce0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43  returns SQLITE_C
21cf0 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70 61  ORRUPT if the pa
21d00 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
21d10 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  field of.** the 
21d20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 64  new child page d
21d30 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
21d40 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  e flags field of
21d50 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65   the parent (i.e
21d60 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65  ..** if an intke
21d70 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20 74  y page appears t
21d80 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74 20  o be the parent 
21d90 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20  of a non-intkey 
21da0 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65  page, or.** vice
21db0 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74  -versa)..*/.stat
21dc0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69  ic int moveToChi
21dd0 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ld(BtCursor *pCu
21de0 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b  r, u32 newPgno){
21df0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
21e00 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65   i = pCur->iPage
21e10 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
21e20 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65  wPage;.  BtShare
21e30 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
21e40 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
21e50 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21e60 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
21e70 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
21e80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
21e90 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21ea0 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
21eb0 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69  MAX_DEPTH );.  i
21ec0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
21ed0 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
21ee0 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
21ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
21f00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
21f10 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
21f20 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
21f30 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20  , &pNewPage);.  
21f40 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
21f50 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61  rc;.  pCur->apPa
21f60 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61  ge[i+1] = pNewPa
21f70 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ge;.  pCur->aiId
21f80 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43  x[i+1] = 0;.  pC
21f90 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20  ur->iPage++;..  
21fa0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
21fb0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
21fc0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
21fd0 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
21fe0 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65  ll<1 || pNewPage
21ff0 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
22000 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65  apPage[i]->intKe
22010 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
22020 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22030 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
22040 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22050 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
22060 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
22070 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
22080 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
22090 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
220a0 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
220b0 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
220c0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
220d0 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
220e0 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
220f0 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
22100 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
22110 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
22120 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
22130 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
22140 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
22150 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
22160 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
22170 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
22180 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
22190 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
221a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
221b0 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
221c0 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65   iChild){.  asse
221d0 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
221e0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
221f0 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
22200 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
22210 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
22220 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
22230 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
22240 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
22250 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
22260 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
22270 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
22280 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
22290 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
222a0 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
222b0 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
222c0 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
222d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
222e0 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
222f0 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
22300 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
22310 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
22320 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
22330 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
22340 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
22350 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
22360 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
22370 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
22380 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
22390 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
223a0 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
223b0 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
223c0 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
223d0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
223e0 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
223f0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
22400 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22410 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
22420 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
22430 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
22440 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
22450 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
22460 67 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>0 );.  assert
22470 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
22480 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
22490 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
224a0 65 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ex(.    pCur->ap
224b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
224c0 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
224d0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
224e0 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d  e-1], .    pCur-
224f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22500 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  age]->pgno.  );.
22510 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
22520 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
22530 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43 75 72  >iPage]);.  pCur
22540 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75  ->iPage--;.  pCu
22550 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
22560 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
22570 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  NKey = 0;.}../*.
22580 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
22590 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  or to point to t
225a0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
225b0 69 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63  its b-tree struc
225c0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
225d0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76  he table has a v
225e0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
225f0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
22600 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f  r is moved to po
22610 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69  int.** to the vi
22620 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
22630 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61  instead of the a
22640 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  ctual root page.
22650 20 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a   A table has a.*
22660 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  * virtual root p
22670 61 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74  age when the act
22680 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f  ual root page co
22690 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
226a0 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65  and a .** single
226b0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69   child page. Thi
226c0 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
226d0 6e 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  n with the table
226e0 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
226f0 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1..**.** If the 
22700 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
22710 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63   is empty, the c
22720 75 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73  ursor state is s
22730 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52  et to .** CURSOR
22740 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77  _INVALID. Otherw
22750 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ise, the cursor 
22760 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
22770 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
22780 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
22790 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72  the root (or vir
227a0 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
227b0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
227c0 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  tate.** is set t
227d0 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
227e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
227f0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
22800 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
22810 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
22820 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
22830 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
22840 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
22850 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
22860 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
22870 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
22880 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
22890 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
228a0 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
228b0 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
228c0 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
228d0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
228e0 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
228f0 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
22900 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
22910 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
22920 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
22930 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
22940 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
22950 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
22960 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
22970 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
22980 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
22990 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
229a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
229b0 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
229c0 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
229d0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
229e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
229f0 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
22a00 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
22a10 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
22a20 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
22a30 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22a40 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
22a50 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
22a60 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
22a70 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
22a80 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
22a90 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
22aa0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
22ab0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
22ac0 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
22ad0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
22ae0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
22af0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
22b00 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
22b10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22b20 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
22b30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
22b40 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
22b50 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
22b60 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
22b70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
22b80 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
22b90 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
22ba0 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
22bb0 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
22bc0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
22bd0 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =1; i<=pCur->iPa
22be0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
22bf0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
22c00 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
22c10 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50    }.    pCur->iP
22c20 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  age = 0;.  }else
22c30 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
22c40 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
22c50 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
22c60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29  pCur->apPage[0])
22c70 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
22c80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22c90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
22ca0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
22cb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
22cc0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
22cd0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20  >iPage = 0;..   
22ce0 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
22cf0 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
22d00 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
22d10 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
22d20 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20 20 2a  his cursor.    *
22d30 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70  * expected to op
22d40 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65  en it on an inde
22d50 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77  x b-tree. Otherw
22d60 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f  ise, if pKeyInfo
22d70 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c   is.    ** NULL,
22d80 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
22d90 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
22da0 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
22db0 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 20  ot the case,.   
22dc0 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51   ** return an SQ
22dd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72  LITE_CORRUPT err
22de0 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  or.  */.    asse
22df0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
22e00 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  [0]->intKey==1 |
22e10 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  | pCur->apPage[0
22e20 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  ]->intKey==0 );.
22e30 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 70      if( (pCur->p
22e40 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 43 75  KeyInfo==0)!=pCu
22e50 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
22e60 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
22e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22e80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
22e90 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74    }..  /* Assert
22ea0 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74 20 70   that the root p
22eb0 61 67 65 20 69 73 20 6f 66 20 74 68 65 20 63 6f  age is of the co
22ec0 72 72 65 63 74 20 74 79 70 65 2e 20 54 68 69 73  rrect type. This
22ed0 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20 20 2a   must be the.  *
22ee0 2a 20 63 61 73 65 20 61 73 20 74 68 65 20 63 61  * case as the ca
22ef0 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ll to this funct
22f00 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65 64 20  ion that loaded 
22f10 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 65  the root-page (e
22f20 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69 73 20  ither.  ** this 
22f30 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76 69 6f  call or a previo
22f40 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29 20 77  us invocation) w
22f50 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74  ould have detect
22f60 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20 0a 20  ed corruption . 
22f70 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73 75 6d   ** if the assum
22f80 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74  ption were not t
22f90 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73 20 6e  rue, and it is n
22fa0 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
22fb0 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a 2a 20  the flags .  ** 
22fc0 62 79 74 65 20 74 6f 20 68 61 76 65 20 62 65 65  byte to have bee
22fd0 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69 6c 65  n modified while
22fe0 20 74 68 69 73 20 63 75 72 73 6f 72 20 69 73 20   this cursor is 
22ff0 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
23000 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  nce.  ** to the 
23010 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f  page.  */.  pRoo
23020 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
23030 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
23040 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
23050 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20  ->pgnoRoot );.  
23060 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
23070 73 49 6e 69 74 20 26 26 20 28 70 43 75 72 2d 3e  sInit && (pCur->
23080 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52  pKeyInfo==0)==pR
23090 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a  oot->intKey );..
230a0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
230b0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
230c0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
230d0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
230e0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
230f0 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Key = 0;..  if( 
23100 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pRoot->nCell==0 
23110 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  && !pRoot->leaf 
23120 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
23130 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
23140 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
23150 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23160 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
23170 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
23180 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
23190 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
231a0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
231b0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
231c0 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
231d0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
231e0 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
231f0 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
23200 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e  tate = ((pRoot->
23210 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f  nCell>0)?CURSOR_
23220 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56  VALID:CURSOR_INV
23230 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ALID);.  }.  ret
23240 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
23250 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
23260 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
23270 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
23280 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
23290 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
232a0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
232b0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
232c0 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
232d0 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
232e0 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
232f0 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
23300 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
23310 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
23320 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
23330 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
23340 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
23350 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23360 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
23370 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
23380 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23390 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
233a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
233b0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
233c0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
233d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
233e0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
233f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23400 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
23410 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23420 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23430 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
23440 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
23450 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
23460 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
23470 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23480 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
23490 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
234a0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
234b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
234c0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
234d0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
234e0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
234f0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
23500 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
23510 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
23520 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
23530 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
23540 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
23550 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
23560 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
23570 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
23580 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
23590 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
235a0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
235b0 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
235c0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
235d0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
235e0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
235f0 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
23600 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
23610 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
23620 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
23630 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
23640 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
23650 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
23660 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
23670 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
23680 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23690 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
236a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
236b0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
236c0 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
236d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
236e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
236f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23700 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23710 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
23720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23730 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  & !(pPage = pCur
23740 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23750 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
23760 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
23770 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
23780 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
23790 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
237a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
237b0 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
237c0 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
237d0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
237e0 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pgno);.  }.  if(
237f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23800 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  {.    pCur->aiId
23810 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
23820 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
23830 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
23840 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
23850 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
23860 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
23870 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
23880 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
23890 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
238a0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
238b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
238c0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
238d0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
238e0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
238f0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
23900 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
23910 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
23920 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
23930 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
23940 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43  e3BtreeFirst(BtC
23950 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
23960 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
23970 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
23980 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23990 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
239a0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
239b0 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
239c0 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
239d0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
239e0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
239f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23a00 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
23a10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
23a20 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61  VALID ){.      a
23a30 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
23a40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23a50 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
23a60 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
23a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23a80 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
23a90 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23aa0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
23ab0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
23ac0 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
23ad0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
23ae0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
23af0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
23b00 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
23b10 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
23b20 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
23b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
23b40 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
23b50 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
23b60 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
23b70 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
23b80 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
23b90 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
23ba0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
23bb0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
23bc0 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
23bd0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
23be0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
23bf0 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
23c00 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23c10 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23c20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23c30 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
23c40 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
23c50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
23c60 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
23c70 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
23c80 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
23c90 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
23ca0 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
23cb0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
23cc0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a  pCur->atLast ){.
23cd0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
23ce0 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
23cf0 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
23d00 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
23d10 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
23d20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
23d30 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
23d40 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
23d50 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
23d60 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
23d70 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
23d80 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
23d90 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
23da0 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
23db0 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
23dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23dd0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
23de0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
23df0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23e00 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
23e10 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23e20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23e30 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
23e40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
23e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23e60 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
23e70 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
23e80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23e90 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
23ea0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
23eb0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
23ec0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23ed0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23ee0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
23ef0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
23f00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
23f10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
23f20 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23f30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
23f40 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
23f50 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
23f60 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
23f70 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20     pCur->atLast 
23f80 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  = rc==SQLITE_OK 
23f90 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ?1:0;.    }.  }.
23fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23fb0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
23fc0 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  or so that it po
23fd0 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
23fe0 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a   near the key .*
23ff0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  * specified by p
24000 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79  IdxKey or intKey
24010 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63  .   Return a suc
24020 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  cess code..**.**
24030 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c   For INTKEY tabl
24040 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70  es, the intKey p
24050 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64  arameter is used
24060 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d  .  pIdxKey .** m
24070 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f  ust be NULL.  Fo
24080 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20  r index tables, 
24090 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20  pIdxKey is used 
240a0 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73  and intKey.** is
240b0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   ignored..**.** 
240c0 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63  If an exact matc
240d0 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  h is not found, 
240e0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
240f0 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66  is always.** lef
24100 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
24110 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
24120 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65  would hold the e
24130 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65  ntry if it.** we
24140 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65  re present.  The
24150 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f   cursor might po
24160 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  int to an entry 
24170 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65  that comes.** be
24180 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68  fore or after th
24190 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  e key..**.** An 
241a0 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74  integer is writt
241b0 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68  en into *pRes wh
241c0 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c  ich is the resul
241d0 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e  t of.** comparin
241e0 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74  g the key with t
241f0 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  he entry to whic
24200 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
24210 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54  .** pointing.  T
24220 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68  he meaning of th
24230 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65  e integer writte
24240 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20  n into.** *pRes 
24250 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
24260 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30  *.**     *pRes<0
24270 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
24280 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
24290 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
242a0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
242b0 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65         is smalle
242c0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
242d0 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20  dxKey or if the 
242e0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a  table is empty.*
242f0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
24300 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f     and the curso
24310 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c  r is therefore l
24320 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74  eft point to not
24330 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  hing..**.**     
24340 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65  *pRes==0     The
24350 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
24360 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
24370 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
24380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
24390 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e  actly matches in
243a0 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
243b0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20  .**     *pRes>0 
243c0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
243d0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
243e0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
243f0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
24400 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20        is larger 
24410 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
24420 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73  Key..**.*/.int s
24430 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
24440 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43  oUnpacked(.  BtC
24450 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
24460 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
24470 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20  sor to be moved 
24480 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
24490 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a  ord *pIdxKey, /*
244a0 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
244b0 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74  key */.  i64 int
244c0 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  Key,            
244d0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b    /* The table k
244e0 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  ey */.  int bias
244f0 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20  Right,          
24500 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61   /* If true, bia
24510 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  s the search to 
24520 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
24530 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
24540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
24550 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
24560 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
24570 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
24580 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24590 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
245a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
245b0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
245c0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
245d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
245e0 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
245f0 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
24600 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
24610 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
24620 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
24630 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
24640 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
24650 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
24660 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
24670 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
24680 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
24690 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
246a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
246b0 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72  OR_VALID && pCur
246c0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20  ->validNKey .   
246d0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
246e0 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
246f0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
24700 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
24710 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
24720 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
24730 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24740 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
24750 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
24760 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
24770 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
24780 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
24790 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
247a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d     }.  }..  rc =
247b0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
247c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
247d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
247e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
247f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
24800 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
24810 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
24820 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
24830 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
24840 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
24850 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24860 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ll>0 || pCur->eS
24870 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
24880 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
24890 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
248a0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
248b0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
248c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
248d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
248e0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
248f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24900 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
24910 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
24920 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  e[0]->intKey || 
24930 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
24940 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
24950 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a 20 20 20  r, upr, idx;.   
24960 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
24970 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24980 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
24990 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
249a0 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a    int c;..    /*
249b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
249c0 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
249d0 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
249e0 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
249f0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
24a00 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
24a10 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
24a20 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
24a30 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
24a40 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
24a50 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
24a60 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
24a70 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
24a80 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
24a90 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
24aa0 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
24ab0 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
24ac0 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
24ad0 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
24ae0 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
24af0 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
24b00 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
24b10 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
24b20 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
24b30 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
24b40 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
24b50 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
24b60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24b70 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
24b80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24b90 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
24ba0 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
24bb0 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
24bc0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
24bd0 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67  .    if( biasRig
24be0 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ht ){.      pCur
24bf0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
24c00 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78  age] = (u16)(idx
24c10 20 3d 20 75 70 72 29 3b 0a 20 20 20 20 7d 65 6c   = upr);.    }el
24c20 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  se{.      pCur->
24c30 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24c40 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d  e] = (u16)(idx =
24c50 20 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20   (upr+lwr)/2);. 
24c60 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29     }.    for(;;)
24c70 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
24c80 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
24c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24ca0 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
24cb0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
24cc0 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
24cd0 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e 61 69 49  ( idx==pCur->aiI
24ce0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
24cf0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  );.      pCur->i
24d00 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
24d10 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
24d20 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
24d30 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
24d40 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  PtrSize;.      i
24d50 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
24d60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
24d70 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
24d80 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
24d90 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
24da0 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
24db0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
24dc0 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
24dd0 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  l, dummy);.     
24de0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
24df0 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
24e00 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
24e10 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
24e20 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  lKey==intKey ){.
24e30 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
24e40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
24e50 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
24e60 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
24e70 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
24e80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
24e90 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
24ea0 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  y>intKey );.    
24eb0 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
24ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24ed0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
24ee0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
24ef0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
24f00 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d  CellKey;.      }
24f10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
24f20 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
24f30 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
24f40 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e   is 65536 bytes.
24f50 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
24f60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
24f70 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
24f80 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
24f90 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
24fa0 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
24fb0 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73   ** page is less
24fc0 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65   than 16384 byte
24fd0 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f  s and may be sto
24fe0 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
24ff0 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
25000 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
25010 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
25020 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
25030 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
25040 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
25050 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
25060 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
25070 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
25080 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
25090 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
250a0 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
250b0 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
250c0 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
250d0 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
250e0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
250f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
25100 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65   int nCell = pCe
25110 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
25120 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38  f( !(nCell & 0x8
25130 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61  0) && nCell<=pPa
25140 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
25150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
25160 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
25170 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
25180 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
25190 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
251a0 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
251b0 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
251c0 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
251d0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
251e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
251f0 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
25200 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
25210 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
25220 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
25230 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
25240 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
25250 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
25260 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
25270 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
25280 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
25290 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
252a0 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
252b0 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
252c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
252d0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
252e0 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
252f0 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
25300 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
25310 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
25320 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
25330 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
25340 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
25350 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
25360 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
25370 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
25380 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
25390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
253a0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
253b0 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
253c0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
253d0 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
253e0 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
253f0 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
25400 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
25410 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
25420 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
25430 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
25440 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
25450 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
25460 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
25470 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
25480 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
25490 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
254a0 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f  an be called. */
254b0 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
254c0 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
254d0 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
254e0 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
254f0 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
25500 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
25510 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
25520 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
25530 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e  lBody, &pCur->in
25540 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  fo);.          n
25550 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72  Cell = (int)pCur
25560 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20  ->info.nKey;.   
25570 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
25580 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
25590 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20   nCell );.      
255a0 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
255b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
255c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
255d0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
255e0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
255f0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
25600 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
25610 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
25620 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28  Cur, 0, nCell, (
25630 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
25640 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20  CellKey, 0);.   
25650 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
25660 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
25670 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
25680 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
25690 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
256a0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
256b0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
256c0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
256d0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
256e0 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
256f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
25700 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
25710 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
25720 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
25730 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
25740 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
25750 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
25760 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
25770 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
25780 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d       upr = lwr -
25790 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
257a0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
257b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  se{.          *p
257c0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
257d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
257e0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  K;.          got
257f0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
25800 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
25810 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30   }.      if( c<0
25820 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20   ){.        lwr 
25830 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d  = idx+1;.      }
25840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70  else{.        up
25850 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
25860 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72   }.      if( lwr
25870 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >upr ){.        
25880 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25890 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
258a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
258b0 28 75 31 36 29 28 69 64 78 20 3d 20 28 6c 77 72  (u16)(idx = (lwr
258c0 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +upr)/2);.    }.
258d0 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d      assert( lwr=
258e0 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61 73  =upr+1 );.    as
258f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
25900 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
25910 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
25920 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a      chldPg = 0;.
25930 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77      }else if( lw
25940 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
25950 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
25960 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
25970 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
25980 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
25990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
259a0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
259b0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
259c0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
259d0 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30     if( chldPg==0
259e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
259f0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
25a00 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
25a10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25a20 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
25a30 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
25a40 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25a50 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
25a60 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
25a70 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
25a80 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25a90 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  e] = (u16)lwr;. 
25aa0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
25ab0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
25ac0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
25ad0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
25ae0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
25af0 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
25b00 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
25b10 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74  inish;.  }.movet
25b20 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75  o_finish:.  retu
25b30 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
25b40 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
25b50 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
25b60 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
25b70 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
25b80 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
25b90 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
25ba0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
25bb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
25bc0 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
25bd0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
25be0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
25bf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
25c00 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
25c10 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
25c20 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
25c30 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
25c40 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
25c50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25c60 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
25c70 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
25c80 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
25c90 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
25ca0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
25cb0 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
25cc0 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
25cd0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
25ce0 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
25cf0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
25d00 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
25d10 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
25d20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
25d30 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
25d40 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
25d50 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
25d60 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
25d70 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
25d80 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
25d90 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
25da0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
25db0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
25dc0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
25dd0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
25de0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
25df0 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
25e00 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
25e10 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
25e20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
25e30 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
25e40 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
25e50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
25e60 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
25e70 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
25e80 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
25e90 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
25ea0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
25eb0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25ec0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
25ed0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
25ee0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
25ef0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
25f00 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
25f10 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
25f20 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69  ( pRes!=0 );.  i
25f30 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
25f40 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
25f50 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
25f60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
25f70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
25f80 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
25f90 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
25fa0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
25fb0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
25fc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25fd0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
25fe0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20  kipNext = 0;..  
25ff0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
26000 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26010 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
26020 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26030 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
26040 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
26050 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
26060 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
26070 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
26080 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
26090 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
260a0 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
260b0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
260c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
260d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
260e0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
260f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
26100 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
26110 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
26120 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
26130 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
26140 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
26150 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
26160 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
26170 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26180 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
26190 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
261a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
261b0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
261c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
261d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
261e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
261f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
26200 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
26210 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
26220 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
26230 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26240 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
26250 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
26260 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
26270 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a  ->nCell );.    *
26280 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  pRes = 0;.    if
26290 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
262a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
262b0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
262c0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
262d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
262e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
262f0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
26300 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
26310 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  0;.  if( pPage->
26320 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
26330 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26340 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c  }.  rc = moveToL
26350 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
26360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
26370 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
26380 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
26390 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
263a0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
263b0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
263c0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
263d0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
263e0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
263f0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
26400 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
26410 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
26420 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
26430 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
26440 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
26450 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
26460 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
26470 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
26480 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
26490 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
264a0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
264b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
264c0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
264d0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
264e0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
264f0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
26500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26520 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73   }.  pCur->atLas
26530 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52  t = 0;.  if( CUR
26540 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
26550 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
26560 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
26570 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26580 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
26590 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
265a0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
265b0 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  xt = 0;.    *pRe
265c0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
265d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
265e0 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  .  pCur->skipNex
265f0 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  t = 0;..  pPage 
26600 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
26610 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
26620 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
26630 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
26640 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
26650 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
26660 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
26670 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
26680 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
26690 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
266a0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
266b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
266c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
266d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
266e0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
266f0 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
26700 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
26710 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
26720 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
26730 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
26740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
26750 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
26760 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
26770 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
26780 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
26790 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
267a0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
267b0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
267c0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  }.    pCur->info
267d0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
267e0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
267f0 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  = 0;..    pCur->
26800 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26810 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
26820 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
26830 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
26840 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
26850 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
26860 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
26870 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
26880 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
26890 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
268a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
268b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
268c0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
268d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
268e0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
268f0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
26900 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
26910 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
26920 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
26930 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
26940 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
26950 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
26960 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
26970 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
26980 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
26990 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
269a0 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
269b0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
269c0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
269d0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
269e0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
269f0 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
26a00 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
26a10 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
26a20 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
26a30 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
26a40 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
26a50 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
26a60 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
26a70 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
26a80 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
26a90 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
26aa0 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
26ab0 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
26ac0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
26ad0 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
26ae0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
26af0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
26b00 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
26b10 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
26b20 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
26b30 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
26b40 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
26b50 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
26b60 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
26b70 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
26b80 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
26b90 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
26ba0 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
26bb0 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
26bc0 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
26bd0 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
26be0 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
26bf0 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
26c00 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
26c10 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
26c20 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
26c30 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
26c40 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
26c50 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
26c60 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
26c70 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
26c80 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
26c90 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
26ca0 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
26cb0 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
26cc0 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
26cd0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
26ce0 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
26cf0 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
26d00 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
26d10 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
26d20 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
26d30 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
26d40 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
26d50 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
26d60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
26d70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
26d80 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
26d90 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
26da0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
26db0 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
26dc0 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
26dd0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
26de0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
26df0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
26e00 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
26e10 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
26e20 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
26e30 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
26e40 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
26e50 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
26e60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
26e70 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
26e80 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20  ex) );.  pPage1 
26e90 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
26ea0 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50   mxPage = btreeP
26eb0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
26ec0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
26ed0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
26ee0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
26ef0 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
26f00 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
26f10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26f20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26f30 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
26f40 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
26f50 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
26f60 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
26f70 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
26f80 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
26f90 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
26fa0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
26fb0 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
26fc0 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
26fd0 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
26fe0 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ' */.    .    /*
26ff0 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20   If the 'exact' 
27000 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72  parameter was tr
27010 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  ue and a query o
27020 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
27030 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
27040 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
27050 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
27060 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
27070 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
27080 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
27090 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
270a0 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
270b0 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
270c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
270d0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
270e0 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d  xact && nearby<=
270f0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
27100 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
27110 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
27120 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
27130 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
27140 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
27150 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
27160 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
27170 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
27180 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
27190 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
271a0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
271b0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
271c0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
271d0 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
271e0 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
271f0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
27200 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
27210 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
27220 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
27230 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
27240 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
27250 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
27260 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
27270 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
27280 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
27290 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
272a0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
272b0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
272c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
272d0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
272e0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
272f0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
27300 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
27310 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
27320 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
27330 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
27340 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
27350 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
27360 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
27370 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
27380 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
27390 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
273a0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
273b0 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
273c0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
273d0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
273e0 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
273f0 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
27400 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
27410 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
27420 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
27430 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27440 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
27450 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
27460 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
27470 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
27480 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78  case( iTrunk==mx
27490 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Page );.      if
274a0 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  ( iTrunk>mxPage 
274b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
274c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
274d0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
274e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
274f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
27500 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
27510 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
27520 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
27530 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
27540 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
27550 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
27560 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27570 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
27580 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
27590 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65 73  ; /* # of leaves
275a0 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20 70   on this trunk p
275b0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
275c0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
275d0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
275e0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
275f0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
27600 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
27610 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
27620 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
27630 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
27640 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
27650 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
27660 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
27670 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
27680 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
27690 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
276a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
276b0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
276c0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
276d0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
276e0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
276f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
27700 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
27710 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
27720 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
27730 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
27740 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
27750 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
27760 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
27770 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
27780 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
27790 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
277a0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
277b0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
277c0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
277d0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
277e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
277f0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
27800 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
27810 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
27820 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
27830 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
27840 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
27850 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27860 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27870 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
27880 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27890 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
278a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
278b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
278c0 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65  searchList && ne
278d0 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a  arby==iTrunk ){.
278e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
278f0 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
27900 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
27910 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
27920 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
27930 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
27940 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
27950 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
27960 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
27970 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
27980 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a  Pgno==iTrunk );.
27990 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
279a0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
279b0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
279c0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
279d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
279e0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
279f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27a00 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
27a10 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
27a20 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
27a30 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
27a40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
27a50 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
27a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
27a70 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
27a80 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
27a90 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
27aa0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
27ac0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
27ad0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
27ae0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
27af0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27b00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27b10 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
27b20 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27b40 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
27b50 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  y(&pPrevTrunk->a
27b60 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
27b70 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
27b80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27b90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27ba0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
27bb0 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72  k page is requir
27bc0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
27bd0 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73   but it contains
27be0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70   .          ** p
27bf0 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d  ointers to free-
27c00 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65  list leaves. The
27c10 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f   first leaf beco
27c20 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20  mes a trunk.    
27c30 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e        ** page in
27c40 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20   this case..    
27c50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
27c60 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
27c70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20  Trunk;.         
27c80 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20   Pgno iNewTrunk 
27c90 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
27ca0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20  nk->aData[8]);. 
27cb0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65           if( iNe
27cc0 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  wTrunk>mxPage ){
27cd0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63   .            rc
27ce0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
27cf0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
27d00 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
27d10 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
27d20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27d30 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
27d40 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
27d50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27d60 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
27d70 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
27d80 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
27d90 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
27da0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27db0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
27dc0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
27dd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27de0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
27df0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
27e00 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
27e10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27e20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
27e40 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
27e50 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
27e60 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
27e70 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
27e80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
27e90 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
27ea0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
27eb0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
27ec0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
27ed0 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
27ee0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
27ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
27f00 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
27f10 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
27f20 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
27f30 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
27f40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
27f50 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
27f60 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
27f70 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
27f80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27f90 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
27fa0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
27fb0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
27fc0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
27fd0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
27fe0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
27ff0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28000 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28010 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28020 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
28030 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
28040 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
28050 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
28060 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
28070 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
28080 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
28090 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
280a0 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
280b0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
280c0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
280d0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
280e0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
280f0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
28100 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
28110 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
28120 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
28130 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
28140 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
28150 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
28160 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
28170 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
28180 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
28190 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
281a0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
281b0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
281c0 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
281d0 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
281e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
281f0 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
28200 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
28210 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
28220 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20  .          dist 
28230 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33  = sqlite3AbsInt3
28240 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74  2(get4byte(&aDat
28250 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  a[8]) - nearby);
28260 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
28270 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
28280 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
28290 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
282a0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
282b0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
282c0 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
282d0 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29     if( d2<dist )
282e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
282f0 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20  closest = i;.   
28300 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20             dist 
28310 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20  = d2;.          
28320 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
28330 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28340 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
28350 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
28360 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d  .        iPage =
28370 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
28380 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a  [8+closest*4]);.
28390 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
283a0 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
283b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
283c0 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20  Page>mxPage ){. 
283d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
283e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
283f0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
28400 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
28410 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
28420 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
28430 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
28440 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
28450 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61  earchList || iPa
28460 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge==nearby ){.  
28470 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
28480 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
28490 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
284a0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
284b0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
284c0 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
284d0 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284f0 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
28500 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
28510 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
28520 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
28530 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
28540 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
28550 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28560 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
28570 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
28580 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
28590 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
285a0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
285b0 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
285c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
285d0 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
285e0 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
285f0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
28600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
28610 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
28620 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
28630 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
28640 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
28650 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
28660 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
28670 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
28680 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
28690 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
286a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
286b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
286c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
286d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
286e0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
286f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28700 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28720 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
28730 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
28740 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
28750 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28760 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
28770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28780 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
28790 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
287a0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
287b0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
287c0 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
287d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
287e0 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
287f0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
28800 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20  list, so create 
28810 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68  a new page at th
28820 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20  e.    ** end of 
28830 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
28840 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28850 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
28860 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
28870 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
28880 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
28890 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
288a0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
288b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
288c0 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
288d0 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
288e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
288f0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
28900 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
28910 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
28920 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
28930 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
28940 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
28950 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
28960 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
28970 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
28980 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
28990 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
289a0 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
289b0 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
289c0 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
289d0 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
289e0 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
289f0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
28a00 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
28a10 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
28a20 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
28a30 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
28a40 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
28a50 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
28a60 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
28a70 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
28a80 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
28a90 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
28aa0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
28ab0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
28ac0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
28ad0 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
28ae0 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
28af0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28b00 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28b10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28b20 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  Pg->pDbPage);.  
28b30 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28b40 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  e(pPg);.      }.
28b50 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
28b60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
28b70 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20  pBt->nPage++;.  
28b80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
28b90 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
28ba0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42  _PAGE(pBt) ){ pB
28bb0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20  t->nPage++; }.  
28bc0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70    }.#endif.    p
28bd0 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38  ut4byte(28 + (u8
28be0 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
28bf0 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65  Data, pBt->nPage
28c00 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  );.    *pPgno = 
28c10 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20  pBt->nPage;..   
28c20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
28c30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
28c40 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72  GE(pBt) );.    r
28c50 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
28c60 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
28c70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 69 66  Page, 1);.    if
28c80 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
28c90 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
28ca0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
28cb0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
28cc0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
28cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28ce0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
28cf0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
28d00 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
28d10 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
28d20 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
28d30 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
28d40 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
28d50 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
28d60 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
28d70 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
28d80 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
28d90 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
28da0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66  PrevTrunk);.  if
28db0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28dc0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
28dd0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
28de0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
28df0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
28e00 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
28e10 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  ppPage);.      r
28e20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28e30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
28e40 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e  .    (*ppPage)->
28e50 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65  isInit = 0;.  }e
28e60 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  lse{.    *ppPage
28e70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
28e80 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
28e90 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  K || sqlite3Page
28ea0 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a 70  rIswriteable((*p
28eb0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
28ec0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
28ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
28ee0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
28ef0 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67  to add page iPag
28f00 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
28f10 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74  e file free-list
28f20 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  . .** It is assu
28f30 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  med that the pag
28f40 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
28f50 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66   a part of the f
28f60 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
28f70 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  The value passed
28f80 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
28f90 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
28fa0 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69  function is opti
28fb0 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20  onal..** If the 
28fc0 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74  caller happens t
28fd0 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72  o have a pointer
28fe0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
28ff0 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65  object .** corre
29000 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
29010 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74   iPage handy, it
29020 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20   may pass it as 
29030 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65  the second value
29040 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  . .** Otherwise,
29050 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c   it may pass NUL
29060 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f  L..**.** If a po
29070 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61  inter to a MemPa
29080 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73  ge object is pas
29090 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
290a0 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69  d argument,.** i
290b0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
290c0 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65  nt is not altere
290d0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
290e0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
290f0 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68  t freePage2(BtSh
29100 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61  ared *pBt, MemPa
29110 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67  ge *pMemPage, Pg
29120 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d  no iPage){.  Mem
29130 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
29140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29150 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72   /* Free-list tr
29160 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  unk page */.  Pg
29170 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20  no iTrunk = 0;  
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
291a0 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72   of free-list tr
291b0 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d  unk page */ .  M
291c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
291d0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20   pBt->pPage1;   
291e0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65     /* Local refe
291f0 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
29200 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
29210 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
29220 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
29230 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61   being freed. Ma
29240 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
29250 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
29260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29270 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
29280 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  de */.  int nFre
29290 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
292a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
292b0 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
292c0 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c   pages on free-l
292d0 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
292e0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
292f0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
29300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50   );.  assert( iP
29310 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
29320 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
29330 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
29340 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
29350 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  pMemPage ){.    
29360 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65  pPage = pMemPage
29370 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
29380 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62  erRef(pPage->pDb
29390 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page);.  }else{.
293a0 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72 65      pPage = btre
293b0 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c  ePageLookup(pBt,
293c0 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20   iPage);.  }..  
293d0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
293e0 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74   free page count
293f0 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20   on pPage1 */.  
29400 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29410 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
29420 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
29430 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
29440 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d  e_out;.  nFree =
29450 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
29460 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
29470 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
29480 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46  1->aData[36], nF
29490 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70  ree+1);..  if( p
294a0 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65  Bt->secureDelete
294b0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
294c0 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20  e secure_delete 
294d0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
294e0 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61  d, then.    ** a
294f0 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72  lways fully over
29500 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
29510 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
29520 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
29530 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
29540 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  ((rc = btreeGetP
29550 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
29560 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20  &pPage, 0))!=0) 
29570 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20  ).     ||       
29580 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69       ((rc = sqli
29590 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
295a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d  age->pDbPage))!=
295b0 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0).    ){.      
295c0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
295d0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  t;.    }.    mem
295e0 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
295f0 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
29600 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
29610 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
29620 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
29630 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
29640 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
29650 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
29660 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
29670 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
29680 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
29690 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
296a0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
296b0 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41  Bt, iPage, PTRMA
296c0 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26  P_FREEPAGE, 0, &
296d0 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rc);.    if( rc 
296e0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
296f0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
29700 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
29710 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
29720 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
29730 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
29740 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
29750 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
29760 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
29770 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
29780 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
29790 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
297a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
297b0 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
297c0 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
297d0 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
297e0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
297f0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
29800 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
29810 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
29820 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
29830 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
29840 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
29850 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
29860 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
29870 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
29880 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
29890 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
298a0 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
298b0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61   ){.    u32 nLea
298c0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
298d0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
298e0 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
298f0 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
29900 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
29910 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
29920 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
29930 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
29940 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
29950 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
29960 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29970 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
29980 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
29990 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61  .    }..    nLea
299a0 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  f = get4byte(&pT
299b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b  runk->aData[4]);
299c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
299d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20  ->usableSize>32 
299e0 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66  );.    if( nLeaf
299f0 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   > (u32)pBt->usa
29a00 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b  bleSize/4 - 2 ){
29a10 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
29a20 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29a30 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
29a40 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
29a50 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20      if( nLeaf < 
29a60 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
29a70 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20  Size/4 - 8 ){.  
29a80 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63      /* In this c
29a90 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f  ase there is roo
29aa0 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70  m on the trunk p
29ab0 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68  age to insert th
29ac0 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  e page.      ** 
29ad0 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
29ae0 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20   new leaf..     
29af0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74   **.      ** Not
29b00 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b  e that the trunk
29b10 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61   page is not rea
29b20 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69  lly full until i
29b30 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  t contains.     
29b40 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
29b50 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f   - 2 entries, no
29b60 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  t usableSize/4 -
29b70 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65   8 entries as we
29b80 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63   have.      ** c
29b90 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74  oded.  But due t
29ba0 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72  o a coding error
29bb0 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   in versions of 
29bc0 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a  SQLite prior to.
29bd0 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20        ** 3.6.0, 
29be0 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66  databases with f
29bf0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
29c00 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65  ges holding more
29c10 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75   than.      ** u
29c20 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
29c30 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20  entries will be 
29c40 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72  reported as corr
29c50 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20  upt.  In order. 
29c60 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74       ** to maint
29c70 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f  ain backwards co
29c80 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68  mpatibility with
29c90 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
29ca0 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  of SQLite,.     
29cb0 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74   ** we will cont
29cc0 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63 74  inue to restrict
29cd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
29ce0 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
29cf0 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
29d00 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
29d10 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
29d20 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
29d30 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
29d40 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
29d50 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
29d60 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
29d70 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
29d80 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
29d90 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
29da0 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
29db0 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
29dc0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
29dd0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
29de0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29df0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
29e00 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
29e10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29e20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
29e30 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
29e40 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
29e50 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
29e60 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
29e70 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
29e80 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
29e90 28 20 70 50 61 67 65 20 26 26 20 21 70 42 74 2d  ( pPage && !pBt-
29ea0 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b  >secureDelete ){
29eb0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
29ec0 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65  e3PagerDontWrite
29ed0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
29ee0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29ef0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
29f00 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
29f10 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
29f20 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
29f30 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
29f40 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
29f50 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
29f60 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
29f70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
29f80 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
29f90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
29fa0 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
29fb0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
29fc0 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
29fd0 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
29fe0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
29ff0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
2a000 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
2a010 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
2a020 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
2a030 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
2a040 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
2a050 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
2a060 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
2a070 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
2a080 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2a090 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
2a0a0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
2a0b0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
2a0c0 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
2a0d0 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
2a0e0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
2a0f0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
2a100 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20  .  if( pPage==0 
2a110 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  && SQLITE_OK!=(r
2a120 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
2a130 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
2a140 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20  age, 0)) ){.    
2a150 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2a160 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  t;.  }.  rc = sq
2a170 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2a180 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2a190 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2a1a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
2a1b0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2a1c0 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50   }.  put4byte(pP
2a1d0 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75  age->aData, iTru
2a1e0 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  nk);.  put4byte(
2a1f0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d  &pPage->aData[4]
2a200 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65  , 0);.  put4byte
2a210 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2a220 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54  32], iPage);.  T
2a230 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
2a240 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
2a250 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
2a260 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
2a270 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65  , iTrunk));..fre
2a280 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  epage_out:.  if(
2a290 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50   pPage ){.    pP
2a2a0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
2a2b0 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61  .  }.  releasePa
2a2c0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c  ge(pPage);.  rel
2a2d0 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
2a2e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2a2f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2a300 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
2a310 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Page, int *pRC){
2a320 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53  .  if( (*pRC)==S
2a330 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a340 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65 32  *pRC = freePage2
2a350 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
2a360 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
2a370 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
2a380 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
2a390 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
2a3a0 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
2a3b0 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   Cell..*/.static
2a3c0 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d   int clearCell(M
2a3d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
2a3e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2a3f0 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ell){.  BtShared
2a400 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2a410 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
2a420 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
2a430 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
2a440 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
2a450 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
2a460 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2a470 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a480 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2a490 29 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73  ) );.  btreePars
2a4a0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
2a4b0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
2a4c0 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
2a4d0 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
2a4e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
2a4f0 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
2a500 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
2a510 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
2a520 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
2a530 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
2a540 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
2a550 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
2a560 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
2a570 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
2a580 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
2a590 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2a5a0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
2a5b0 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
2a5c0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
2a5d0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
2a5e0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
2a5f0 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
2a600 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
2a610 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
2a620 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
2a630 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
2a640 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2a650 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
2a660 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
2a670 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2a680 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
2a690 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
2a6a0 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
2a6b0 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
2a6c0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
2a6d0 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
2a6e0 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
2a6f0 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
2a700 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
2a710 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
2a720 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2a730 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
2a740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2a750 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2a760 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
2a770 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
2a780 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
2a790 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
2a7a0 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
2a7b0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2a7c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2a7d0 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
2a7e0 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
2a7f0 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2a800 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
2a810 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
2a820 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2a830 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
2a840 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
2a850 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
2a860 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
2a870 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
2a880 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
2a890 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
2a8a0 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
2a8b0 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
2a8c0 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
2a8d0 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
2a8e0 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
2a8f0 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
2a900 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
2a910 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
2a920 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
2a930 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
2a940 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
2a950 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
2a960 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
2a970 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2a980 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
2a990 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
2a9a0 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
2a9b0 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
2a9c0 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
2a9d0 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
2a9e0 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
2a9f0 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
2aa00 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
2aa10 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
2aa20 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
2aa30 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
2aa40 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
2aa50 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
2aa60 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
2aa70 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
2aa80 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
2aa90 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
2aaa0 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
2aab0 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
2aac0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2aad0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2aae0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
2aaf0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
2ab00 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
2ab10 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
2ab20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2ab30 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
2ab40 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2ab50 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
2ab60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2ab70 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ab80 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
2ab90 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
2aba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2abb0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
2abc0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
2abd0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
2abe0 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
2abf0 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
2ac00 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
2ac10 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
2ac20 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
2ac30 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
2ac40 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
2ac50 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
2ac60 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
2ac70 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
2ac80 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
2ac90 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
2aca0 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
2acb0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
2acc0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
2acd0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
2ace0 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
2acf0 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
2ad00 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
2ad10 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
2ad20 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
2ad30 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
2ad40 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
2ad50 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
2ad60 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
2ad70 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
2ad80 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
2ad90 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
2ada0 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
2adb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2adc0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
2add0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
2ade0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2adf0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
2ae00 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
2ae10 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2ae20 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2ae30 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
2ae40 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
2ae50 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2ae60 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
2ae70 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
2ae80 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2ae90 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
2aea0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
2aeb0 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
2aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aed0 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
2aee0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
2aef0 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
2af00 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
2af10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2af20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
2af30 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2af40 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
2af50 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
2af60 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
2af70 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
2af80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
2af90 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
2afa0 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
2afb0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2afc0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
2afd0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
2afe0 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
2aff0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2b000 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
2b010 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
2b020 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
2b030 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
2b040 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2b050 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2b060 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
2b070 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
2b080 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
2b090 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
2b0a0 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
2b0b0 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
2b0c0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
2b0d0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
2b0e0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
2b0f0 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
2b100 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
2b110 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
2b120 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2b130 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2b140 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2b150 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2b160 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2b170 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2b180 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
2b190 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
2b1a0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2b1b0 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
2b1c0 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
2b1d0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
2b1e0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2b1f0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
2b200 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
2b210 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
2b220 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
2b230 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
2b240 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
2b250 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
2b260 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
2b270 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61  nKey);.  btreePa
2b280 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2b290 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
2b2a0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2b2b0 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
2b2c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2b2d0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
2b2e0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2b2f0 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
2b300 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
2b310 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2b320 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
2b330 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
2b340 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
2b350 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
2b360 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2b370 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
2b380 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
2b390 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
2b3a0 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30  if( NEVER(nKey>0
2b3b0 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
2b3c0 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
2b3d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2b3e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2b3f0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
2b400 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
2b410 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
2b420 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
2b430 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
2b440 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
2b450 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
2b460 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
2b470 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
2b480 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
2b490 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
2b4a0 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
2b4b0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
2b4c0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
2b4d0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
2b4e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2b4f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2b500 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
2b510 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
2b520 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2b530 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
2b540 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
2b550 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2b560 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
2b570 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
2b580 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
2b590 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
2b5a0 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
2b5b0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
2b5c0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
2b5d0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2b5e0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
2b5f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2b600 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2b610 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2b620 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
2b630 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
2b640 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b650 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2b660 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2b670 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2b680 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
2b690 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
2b6a0 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
2b6b0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2b6c0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
2b6d0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
2b6e0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
2b6f0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
2b700 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
2b710 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
2b720 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
2b730 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
2b740 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
2b750 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
2b760 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
2b770 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2b780 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
2b790 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
2b7a0 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
2b7b0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
2b7c0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
2b7d0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
2b7e0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
2b7f0 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
2b800 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
2b810 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73   the uninitialis
2b820 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
2b830 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
2b840 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
2b850 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
2b860 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2b870 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2b880 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
2b890 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2b8a0 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
2b8b0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
2b8c0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
2b8d0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
2b8e0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2b8f0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
2b900 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
2b910 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
2b920 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2b930 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
2b940 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
2b950 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2b960 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2b970 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2b980 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2b990 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2b9a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2b9b0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2b9c0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2b9d0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
2b9e0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
2b9f0 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
2ba00 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2ba10 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2ba20 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2ba30 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
2ba40 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
2ba50 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
2ba60 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2ba70 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
2ba80 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
2ba90 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
2baa0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
2bab0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
2bac0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
2bad0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
2bae0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
2baf0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2bb00 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
2bb10 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
2bb20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2bb30 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2bb40 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2bb50 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2bb60 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2bb70 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
2bb80 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
2bb90 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
2bba0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2bbb0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
2bbc0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
2bbd0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
2bbe0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
2bbf0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
2bc00 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
2bc10 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
2bc20 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
2bc30 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
2bc40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2bc50 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
2bc60 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
2bc70 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
2bc80 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
2bc90 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
2bca0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
2bcb0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
2bcc0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
2bcd0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
2bce0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
2bcf0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
2bd00 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
2bd10 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
2bd20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2bd30 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2bd40 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2bd50 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2bd60 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2bd70 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
2bd80 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2bd90 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2bda0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2bdb0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
2bdc0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2bdd0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
2bde0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
2bdf0 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
2be00 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
2be10 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2be20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2be30 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2be40 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2be50 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2be60 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
2be70 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
2be80 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
2be90 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
2bea0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
2beb0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
2bec0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2bed0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
2bee0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
2bef0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
2bf00 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
2bf10 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
2bf20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
2bf30 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
2bf40 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
2bf50 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
2bf60 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2bf70 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
2bf80 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
2bf90 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2bfa0 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
2bfb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2bfc0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2bfd0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
2bfe0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
2bff0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
2c000 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
2c010 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
2c020 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
2c030 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
2c040 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
2c050 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2c060 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
2c070 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
2c080 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2c090 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
2c0a0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2c0b0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
2c0c0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
2c0d0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
2c0e0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2c0f0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
2c100 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
2c110 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2c120 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
2c130 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
2c140 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
2c150 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
2c160 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
2c170 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
2c180 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2c190 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
2c1a0 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
2c1b0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
2c1c0 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
2c1d0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
2c1e0 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e  ta[] */.  u8 *en
2c1f0 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e 64  dPtr;     /* End
2c200 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
2c210 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2c220 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2c230 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2c240 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2c250 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2c260 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2c270 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2c280 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2c290 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2c2a0 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2c2b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2c2c0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2c2d0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2c2e0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2c2f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2c300 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2c310 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2c320 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c330 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2c340 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2c350 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2c360 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
2c370 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
2c380 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
2c390 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
2c3a0 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  r);.  hdr = pPag
2c3b0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2c3c0 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65  testcase( pc==ge
2c3d0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2c3e0 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61  +5]) );.  testca
2c3f0 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65  se( pc+sz==pPage
2c400 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2c410 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20  e );.  if( pc < 
2c420 28 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64  (u32)get2byte(&d
2c430 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70  ata[hdr+5]) || p
2c440 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  c+sz > pPage->pB
2c450 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
2c460 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
2c470 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2c480 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2c490 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
2c4a0 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
2c4b0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2c4c0 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2c4d0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 65   return;.  }.  e
2c4e0 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b 70 50  ndPtr = &data[pP
2c4f0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
2c500 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
2c510 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28   - 2];.  assert(
2c520 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
2c530 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29  INT(ptr)&1)==0 )
2c540 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77  ;  /* ptr is alw
2c550 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e  ays 2-byte align
2c560 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70  ed */.  while( p
2c570 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20  tr<endPtr ){.   
2c580 20 2a 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28   *(u16*)ptr = *(
2c590 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20  u16*)&ptr[2];.  
2c5a0 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a    ptr += 2;.  }.
2c5b0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
2c5c0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2c5d0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
2c5e0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67  ->nCell);.  pPag
2c5f0 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d  e->nFree += 2;.}
2c600 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2c610 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
2c620 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
2c630 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
2c640 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
2c650 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
2c660 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
2c670 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
2c680 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
2c690 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
2c6a0 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
2c6b0 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
2c6c0 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
2c6d0 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2c6e0 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
2c6f0 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
2c700 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
2c710 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
2c720 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
2c730 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
2c740 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
2c750 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
2c760 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
2c770 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
2c780 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
2c790 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
2c7a0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
2c7b0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
2c7c0 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
2c7d0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
2c7e0 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
2c7f0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2c800 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
2c810 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
2c820 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2c830 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
2c840 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
2c850 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
2c860 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
2c870 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2c880 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
2c890 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
2c8a0 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
2c8b0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
2c8c0 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
2c8d0 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
2c8e0 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
2c8f0 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
2c900 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
2c910 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
2c920 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c  c void insertCel
2c930 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
2c940 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
2c950 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
2c960 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
2c970 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
2c980 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
2c990 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
2c9a0 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
2c9b0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
2c9c0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
2c9d0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
2c9e0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
2c9f0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
2ca00 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
2ca10 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
2ca20 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
2ca30 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
2ca40 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
2ca50 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20  eeded */.  Pgno 
2ca60 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20  iChild,      /* 
2ca70 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70  If non-zero, rep
2ca80 6c 61 63 65 20 66 69 72 73 74 20 34 20 62 79 74  lace first 4 byt
2ca90 65 73 20 77 69 74 68 20 74 68 69 73 20 76 61 6c  es with this val
2caa0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43  ue */.  int *pRC
2cab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
2cac0 64 20 61 6e 64 20 77 72 69 74 65 20 72 65 74 75  d and write retu
2cad0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72  rn code from her
2cae0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64  e */.){.  int id
2caf0 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57  x = 0;      /* W
2cb00 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65  here to write ne
2cb10 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  w cell content i
2cb20 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
2cb30 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  t j;            
2cb40 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2cb50 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20  */.  int end;   
2cb60 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2cb70 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61  byte past the la
2cb80 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
2cb90 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
2cba0 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20  nt ins;         
2cbb0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74   /* Index in dat
2cbc0 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65  a[] where new ce
2cbd0 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e  ll pointer is in
2cbe0 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  serted */.  int 
2cbf0 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a  cellOffset;   /*
2cc00 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73   Address of firs
2cc10 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
2cc20 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38  n data[] */.  u8
2cc30 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
2cc40 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
2cc50 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
2cc60 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
2cc70 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
2cc80 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72  for moving infor
2cc90 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e  mation around in
2cca0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2ccb0 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f  *endPtr;       /
2ccc0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f  * End of the loo
2ccd0 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69  p */..  int nSki
2cce0 70 20 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20  p = (iChild ? 4 
2ccf0 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52  : 0);..  if( *pR
2cd00 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
2cd10 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
2cd20 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
2cd30 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2cd40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2cd50 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
2cd60 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26  LL(pPage->pBt) &
2cd70 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  & MX_CELL(pPage-
2cd80 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a  >pBt)<=10921 );.
2cd90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2cda0 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
2cdb0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76  ySize(pPage->aOv
2cdc0 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
2cdd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2cde0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2cdf0 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
2ce00 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e  he cell should n
2ce10 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64  ormally be sized
2ce20 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77   correctly.  How
2ce30 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e  ever, when movin
2ce40 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d  g a.  ** malform
2ce50 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c  ed cell from a l
2ce60 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69  eaf page to an i
2ce70 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66  nterior page, if
2ce80 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20   the cell size. 
2ce90 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65   ** wanted to be
2cea0 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74   less than 4 but
2ceb0 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20   got rounded up 
2cec0 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66  to 4 on the leaf
2ced0 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a  , then size.  **
2cee0 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74   might be less t
2cef0 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65  han 8 (leaf-size
2cf00 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74   + pointer) on t
2cf10 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65  he interior node
2cf20 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68  .  Hence.  ** th
2cf30 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65  e term after the
2cf40 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   || in the follo
2cf50 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a  wing assert(). *
2cf60 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  /.  assert( sz==
2cf70 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2cf80 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
2cf90 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
2cfa0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
2cfb0 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
2cfc0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
2cfd0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
2cfe0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
2cff0 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
2d000 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
2d010 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
2d020 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
2d030 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
2d040 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
2d050 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29  e(pCell, iChild)
2d060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20  ;.    }.    j = 
2d070 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2d080 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ++;.    assert( 
2d090 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70  j<(int)(sizeof(p
2d0a0 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a  Page->aOvfl)/siz
2d0b0 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
2d0c0 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
2d0d0 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65  ge->aOvfl[j].pCe
2d0e0 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ll = pCell;.    
2d0f0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
2d100 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20  idx = (u16)i;.  
2d110 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
2d120 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d130 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2d140 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2d150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d160 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b        *pRC = rc;
2d170 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
2d180 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2d190 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2d1a0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2d1b0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
2d1c0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2d1d0 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  ata;.    cellOff
2d1e0 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
2d1f0 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
2d200 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
2d210 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
2d220 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66      ins = cellOf
2d230 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20  fset + 2*i;.    
2d240 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
2d250 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
2d260 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
2d270 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
2d280 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
2d290 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
2d2a0 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
2d2b0 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
2d2c0 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69  ing two properti
2d2d0 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20  es.    ** if it 
2d2e0 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 20  returns success 
2d2f0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  */.    assert( i
2d300 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20  dx >= end+2 );. 
2d310 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b 73     assert( idx+s
2d320 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  z <= (int)pPage-
2d330 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2d340 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
2d350 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
2d360 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36  e->nFree -= (u16
2d370 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d  )(2 + sz);.    m
2d380 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
2d390 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
2d3a0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2d3b0 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
2d3c0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
2d3d0 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68  (&data[idx], iCh
2d3e0 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
2d3f0 70 74 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d  ptr = &data[end]
2d400 3b 0a 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26  ;.    endPtr = &
2d410 64 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61  data[ins];.    a
2d420 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50  ssert( (SQLITE_P
2d430 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31  TR_TO_INT(ptr)&1
2d440 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20  )==0 );  /* ptr 
2d450 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65  is always 2-byte
2d460 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20   aligned */.    
2d470 77 68 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74  while( ptr>endPt
2d480 72 20 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36  r ){.      *(u16
2d490 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26  *)ptr = *(u16*)&
2d4a0 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70  ptr[-2];.      p
2d4b0 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20  tr -= 2;.    }. 
2d4c0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
2d4d0 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
2d4e0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2d4f0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2d500 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
2d510 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
2d520 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2d530 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67  UUM.    if( pPag
2d540 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  e->pBt->autoVacu
2d550 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  um ){.      /* T
2d560 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74  he cell may cont
2d570 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ain a pointer to
2d580 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2d590 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a  e. If so, write.
2d5a0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
2d5b0 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ry for the overf
2d5c0 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68  low page into th
2d5d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20  e pointer map.. 
2d5e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74       */.      pt
2d5f0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
2d600 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43  Page, pCell, pRC
2d610 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
2d620 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64    }.}../*.** Add
2d630 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73   a list of cells
2d640 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65   to a page.  The
2d650 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20   page should be 
2d660 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e  initially empty.
2d670 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72  .** The cells ar
2d680 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
2d690 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  fit on the page.
2d6a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2d6b0 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20  assemblePage(.  
2d6c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2d6d0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f    /* The page to
2d6e0 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a   be assemblied *
2d6f0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
2d700 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
2d710 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ber of cells to 
2d720 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67 65  add to this page
2d730 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
2d740 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  l,      /* Point
2d750 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69  ers to cell bodi
2d760 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69  es */.  u16 *aSi
2d770 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ze        /* Siz
2d780 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  es of the cells 
2d790 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
2d7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2d7b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
2d7c0 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20  8 *pCellptr;    
2d7d0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
2d7e0 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ext cell pointer
2d7f0 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f   */.  int cellbo
2d800 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65  dy;     /* Addre
2d810 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20  ss of next cell 
2d820 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63  body */.  u8 * c
2d830 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67  onst data = pPag
2d840 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  e->aData;       
2d850 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2d860 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61   to data for pPa
2d870 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2d880 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
2d890 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  drOffset;       
2d8a0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2d8b0 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65   header on pPage
2d8c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2d8d0 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d  nUsable = pPage-
2d8e0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2d8f0 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65  ; /* Usable size
2d900 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61   of page */..  a
2d910 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2d920 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
2d930 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2d940 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2d950 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2d960 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
2d970 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69  >=0 && nCell<=(i
2d980 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  nt)MX_CELL(pPage
2d990 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20 20 20  ->pBt).         
2d9a0 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45     && (int)MX_CE
2d9b0 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2d9c0 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74  10921);.  assert
2d9d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2d9e0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2d9f0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2da00 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2da10 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
2da20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
2da30 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
2da40 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2da50 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
2da60 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  rt( get2byteNotZ
2da70 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
2da80 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20  )==nUsable );.. 
2da90 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 64 61 74   pCellptr = &dat
2daa0 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
2dab0 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a  set + nCell*2];.
2dac0 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e 55 73    cellbody = nUs
2dad0 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d 6e 43  able;.  for(i=nC
2dae0 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ell-1; i>=0; i--
2daf0 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20 3d 20  ){.    u16 sz = 
2db00 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 43  aSize[i];.    pC
2db10 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20  ellptr -= 2;.   
2db20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73 7a 3b   cellbody -= sz;
2db30 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43  .    put2byte(pC
2db40 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f 64 79  ellptr, cellbody
2db50 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
2db60 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61  ata[cellbody], a
2db70 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20  pCell[i], sz);. 
2db80 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64   }.  put2byte(&d
2db90 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c  ata[hdr+3], nCel
2dba0 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  l);.  put2byte(&
2dbb0 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c  data[hdr+5], cel
2dbc0 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
2dbd0 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c  >nFree -= (nCell
2dbe0 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63  *2 + nUsable - c
2dbf0 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
2dc00 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29  e->nCell = (u16)
2dc10 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nCell;.}../*.** 
2dc20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
2dc30 72 61 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69  rameters determi
2dc40 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61  ne how many adja
2dc50 63 65 6e 74 20 70 61 67 65 73 20 67 65 74 20 69  cent pages get i
2dc60 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20  nvolved.** in a 
2dc70 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
2dc80 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20  ion.  NN is the 
2dc90 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  number of neighb
2dca0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2dcb0 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  de.** of the pag
2dcc0 65 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61  e that participa
2dcd0 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
2dce0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
2dcf0 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74  NB is the.** tot
2dd00 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2dd10 65 73 20 74 68 61 74 20 70 61 72 74 69 63 69 70  es that particip
2dd20 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74  ate, including t
2dd30 68 65 20 74 61 72 67 65 74 20 70 61 67 65 20 61  he target page a
2dd40 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f  nd.** NN neighbo
2dd50 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64  rs on either sid
2dd60 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e  e..**.** The min
2dd70 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e  imum value of NN
2dd80 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65   is 1 (of course
2dd90 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e  ).  Increasing N
2dda0 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f  N above 1.** (to
2ddb0 20 32 20 6f 72 20 33 29 20 67 69 76 65 73 20 61   2 or 3) gives a
2ddc0 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d   modest improvem
2ddd0 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e  ent in SELECT an
2dde0 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d  d DELETE perform
2ddf0 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61  ance.** in excha
2de00 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72  nge for a larger
2de10 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20   degradation in 
2de20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
2de30 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  E performance..*
2de40 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e  * The value of N
2de50 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67 69 76  N appears to giv
2de60 65 20 74 68 65 20 62 65 73 74 20 72 65 73 75 6c  e the best resul
2de70 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23  ts overall..*/.#
2de80 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20  define NN 1     
2de90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2dea0 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
2deb0 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  n either side of
2dec0 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e   pPage */.#defin
2ded0 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20  e NB (NN*2+1)   
2dee0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65     /* Total page
2def0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
2df00 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23  e balance */...#
2df10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2df20 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
2df30 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
2df40 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
2df50 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
2df60 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
2df70 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
2df80 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
2df90 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
2dfa0 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
2dfb0 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
2dfc0 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
2dfd0 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
2dfe0 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
2dff0 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
2e000 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
2e010 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
2e020 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61 6c 61  f trying to bala
2e030 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d  nce the 3 right-
2e040 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c  most leaf pages,
2e050 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e   just add.** a n
2e060 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72  ew page to the r
2e070 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61  ight-hand side a
2e080 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e  nd put the one n
2e090 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74  ew entry in.** t
2e0a0 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20  hat page.  This 
2e0b0 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74  leaves the right
2e0c0 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65   side of the tre
2e0d0 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e  e somewhat.** un
2e0e0 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f  balanced.  But o
2e0f0 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20  dds are that we 
2e100 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e  will be insertin
2e110 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a  g new entries.**
2e120 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e   at the end soon
2e130 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74   afterwards so t
2e140 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20  he nearly empty 
2e150 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c  page will quickl
2e160 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f  y.** fill up.  O
2e170 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a  n average..**.**
2e180 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65   pPage is the le
2e190 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73  af page which is
2e1a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2e1b0 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65  page in the tree
2e1c0 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20  ..** pParent is 
2e1d0 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61  its parent.  pPa
2e1e0 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73  ge must have a s
2e1f0 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65  ingle overflow e
2e200 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73  ntry.** which is
2e210 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d   also the right-
2e220 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  most entry on th
2e230 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e page..**.** Th
2e240 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
2e250 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
2e260 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 6f 70   a temporary cop
2e270 79 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  y of the divider
2e280 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20 77 69  .** cell that wi
2e290 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ll be inserted i
2e2a0 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53 75 63  nto pParent. Suc
2e2b0 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  h a cell consist
2e2c0 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79 74 65  s of a 4.** byte
2e2d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c   page number fol
2e2e0 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72 69 61  lowed by a varia
2e2f0 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2e300 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  er. In other.** 
2e310 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74 20 31  words, at most 1
2e320 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65 20 74  3 bytes. Hence t
2e330 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
2e340 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c   must be at.** l
2e350 65 61 73 74 20 31 33 20 62 79 74 65 73 20 69 6e  east 13 bytes in
2e360 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
2e370 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
2e380 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ck(MemPage *pPar
2e390 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  ent, MemPage *pP
2e3a0 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63 65 29  age, u8 *pSpace)
2e3b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 63 6f  {.  BtShared *co
2e3c0 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67 65 2d  nst pBt = pPage-
2e3d0 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72  >pBt;    /* B-Tr
2e3e0 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee Database */. 
2e3f0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20   MemPage *pNew; 
2e400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e410 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
2e420 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f  llocated page */
2e430 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e450 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2e460 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f  n Code */.  Pgno
2e470 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20   pgnoNew;       
2e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e490 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2e4a0 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73  of pNew */..  as
2e4b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2e4c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2e4d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2e4e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e4f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2e500 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2e510 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
2e520 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2e530 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ==1 );..  /* Thi
2e540 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  s error conditio
2e550 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20  n is now caught 
2e560 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e  prior to reachin
2e570 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
2e580 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
2e590 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72  nCell<=0 ) retur
2e5a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2e5b0 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _BKPT;..  /* All
2e5c0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2e5d0 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c  . This page will
2e5e0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68   become the righ
2e5f0 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20  t-sibling of .  
2e600 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74  ** pPage. Make t
2e610 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
2e620 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74  ritable, so that
2e630 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
2e640 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62   cell.  ** may b
2e650 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62  e inserted. If b
2e660 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74  oth these operat
2e670 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
2e680 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20  ful, proceed..  
2e690 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
2e6a0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2e6b0 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
2e6c0 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20  , 0, 0);..  if( 
2e6d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2e6e0 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d  ..    u8 *pOut =
2e6f0 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20   &pSpace[4];.   
2e700 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61   u8 *pCell = pPa
2e710 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
2e720 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  ll;.    u16 szCe
2e730 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
2e740 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2e750 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
2e760 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2e770 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e780 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
2e790 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
2e7a0 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
2e7b0 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
2e7c0 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
2e7d0 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
2e7e0 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
2e7f0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2e800 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
2e810 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
2e820 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
2e830 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20   &szCell);..    
2e840 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2e850 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2e860 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
2e870 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
2e880 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
2e890 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
2e8a0 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
2e8b0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
2e8c0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
2e8d0 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
2e8e0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
2e8f0 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
2e900 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
2e910 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
2e920 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
2e930 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
2e940 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
2e950 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
2e960 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
2e970 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
2e980 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
2e990 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
2e9a0 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
2e9b0 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
2e9c0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
2e9d0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2e9e0 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
2e9f0 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
2ea00 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
2ea10 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
2ea20 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
2ea30 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2ea40 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2ea50 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2ea60 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  {.      ptrmapPu
2ea70 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
2ea80 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
2ea90 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63  arent->pgno, &rc
2eaa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
2eab0 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
2eac0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 74  al ){.        pt
2ead0 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
2eae0 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  New, pCell, &rc)
2eaf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2eb00 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65    .    /* Create
2eb10 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
2eb20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70  to insert into p
2eb30 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69  Parent. The divi
2eb40 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20  der cell.    ** 
2eb50 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d  consists of a 4-
2eb60 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
2eb70 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65   (the page numbe
2eb80 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a  r of pPage) and.
2eb90 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c      ** a variabl
2eba0 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c  e length key val
2ebb0 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62  ue (which must b
2ebc0 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
2ebd0 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c   as the.    ** l
2ebe0 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50  argest key on pP
2ebf0 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  age)..    **.   
2ec00 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20   ** To find the 
2ec10 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75  largest key valu
2ec20 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73  e on pPage, firs
2ec30 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74  t find the right
2ec40 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65  -most .    ** ce
2ec50 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65  ll on pPage. The
2ec60 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64   first two field
2ec70 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61  s of this cell a
2ec80 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72  re the .    ** r
2ec90 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20  ecord-length (a 
2eca0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2ecb0 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20  integer at most 
2ecc0 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29  32-bits in size)
2ecd0 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  .    ** and the 
2ece0 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72  key value (a var
2ecf0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2ed00 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61  eger, may have a
2ed10 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a  ny value)..    *
2ed20 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74  * The first of t
2ed30 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  he while(...) lo
2ed40 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20  ops below skips 
2ed50 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d  over the record-
2ed60 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69  length.    ** fi
2ed70 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  eld. The second 
2ed80 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20  while(...) loop 
2ed90 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76  copies the key v
2eda0 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20  alue from the.  
2edb0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61    ** cell on pPa
2edc0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61  ge into the pSpa
2edd0 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a  ce buffer..    *
2ede0 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  /.    pCell = fi
2edf0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50  ndCell(pPage, pP
2ee00 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20  age->nCell-1);. 
2ee10 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
2ee20 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
2ee30 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38   (*(pCell++)&0x8
2ee40 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
2ee50 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d  p );.    pStop =
2ee60 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20   &pCell[9];.    
2ee70 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b  while( ((*(pOut+
2ee80 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29  +) = *(pCell++))
2ee90 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
2eea0 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a  pStop );..    /*
2eeb0 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
2eec0 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74  divider cell int
2eed0 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  o pParent. */.  
2eee0 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
2eef0 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e 6e  rent, pParent->n
2ef00 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28 69  Cell, pSpace, (i
2ef10 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29  nt)(pOut-pSpace)
2ef20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ef30 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c   0, pPage->pgno,
2ef40 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   &rc);..    /* S
2ef50 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  et the right-chi
2ef60 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70 50  ld pointer of pP
2ef70 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20 74  arent to point t
2ef80 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 20  o the new page. 
2ef90 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  */.    put4byte(
2efa0 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
2efb0 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
2efc0 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29 3b  et+8], pgnoNew);
2efd0 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61  .  .    /* Relea
2efe0 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  se the reference
2eff0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
2f000 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73 65  . */.    release
2f010 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  Page(pNew);.  }.
2f020 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f030 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2f040 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
2f050 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a 0a  CE */..#if 0./*.
2f060 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f070 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69   does not contri
2f080 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74 6f  bute anything to
2f090 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6f   the operation o
2f0a0 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74 20  f SQLite..** it 
2f0b0 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63 74  is sometimes act
2f0c0 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72 69  ivated temporari
2f0d0 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67 69  ly while debuggi
2f0e0 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73 69  ng code responsi
2f0f0 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74 74  ble .** for sett
2f100 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  ing pointer-map 
2f110 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
2f120 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68 65  ic int ptrmapChe
2f130 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20  ckPages(MemPage 
2f140 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e 50  **apPage, int nP
2f150 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  age){.  int i, j
2f160 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2f170 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
2f180 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20 65  Pgno n;.    u8 e
2f190 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2f1a0 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69 5d  Page = apPage[i]
2f1b0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
2f1c0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
2f1d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f1e0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
2f1f0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
2f200 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b 2b  Page->nCell; j++
2f210 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  ){.      CellInf
2f220 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75 38  o info;.      u8
2f230 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20 20   *z;.     .     
2f240 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50   z = findCell(pP
2f250 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20 62  age, j);.      b
2f260 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
2f270 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f  (pPage, z, &info
2f280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66  );.      if( inf
2f290 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
2f2a0 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c         Pgno ovfl
2f2b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69   = get4byte(&z[i
2f2c0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
2f2d0 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
2f2e0 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65  et(pBt, ovfl, &e
2f2f0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
2f300 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
2f310 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
2f320 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a  AP_OVERFLOW1 );.
2f330 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2f340 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2f350 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63  {.        Pgno c
2f360 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2f370 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  z);.        ptrm
2f380 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
2f390 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2f3a0 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2f3b0 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2f3c0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
2f3d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f3e0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2f3f0 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  af ){.      Pgno
2f400 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2f410 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2f420 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2f430 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d  +8]);.      ptrm
2f440 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64  apGet(pBt, child
2f450 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
2f460 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2f470 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2f480 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20  RMAP_BTREE );.  
2f490 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2f4a0 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   1;.}.#endif../*
2f4b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2f4c0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70  n is used to cop
2f4d0 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  y the contents o
2f4e0 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64  f the b-tree nod
2f4f0 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20  e stored .** on 
2f500 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
2f510 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20  ge pTo. If page 
2f520 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20  pFrom was not a 
2f530 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a  leaf page, then.
2f540 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
2f550 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65  ap entries for e
2f560 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61  ach child page a
2f570 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  re updated so th
2f580 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74  at the.** parent
2f590 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20   page stored in 
2f5a0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
2f5b0 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  is page pTo. If 
2f5c0 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a  pFrom contained.
2f5d0 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74  ** any cells wit
2f5e0 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  h overflow page 
2f5f0 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74  pointers, then t
2f600 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2f610 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
2f620 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f  entries are also
2f630 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74   updated so that
2f640 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2f650 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a   is page pTo..**
2f660 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20  .** If pFrom is 
2f670 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69  currently carryi
2f680 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ng any overflow 
2f690 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69  cells (entries i
2f6a0 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65  n the.** MemPage
2f6b0 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c  .aOvfl[] array),
2f6c0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f   they are not co
2f6d0 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a  pied to pTo. .**
2f6e0 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
2f6f0 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69  ning, page pTo i
2f700 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  s reinitialized 
2f710 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69 74 50  using btreeInitP
2f720 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  age()..**.** The
2f730 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
2f740 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f750 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20 49   not critical. I
2f760 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  t is only used b
2f770 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e 63  y .** the balanc
2f780 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61 6e  e_shallower() an
2f790 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  d balance_deeper
2f7a0 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20 6e  () procedures, n
2f7b0 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68 69  either of.** whi
2f7c0 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f 66  ch are called of
2f7d0 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61 6c  ten under normal
2f7e0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e 0a   circumstances..
2f7f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2f800 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d  opyNodeContent(M
2f810 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d  emPage *pFrom, M
2f820 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69 6e 74  emPage *pTo, int
2f830 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
2f840 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
2f850 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
2f860 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46  * const pBt = pF
2f870 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20 75 38  rom->pBt;.    u8
2f880 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d 20 3d   * const aFrom =
2f890 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20   pFrom->aData;. 
2f8a0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 54     u8 * const aT
2f8b0 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61 3b 0a  o = pTo->aData;.
2f8c0 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 46      int const iF
2f8d0 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d 2d 3e  romHdr = pFrom->
2f8e0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 69  hdrOffset;.    i
2f8f0 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72 20  nt const iToHdr 
2f900 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d 31  = ((pTo->pgno==1
2f910 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20 20  ) ? 100 : 0);.  
2f920 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
2f930 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20 0a 20  t iData;.  .  . 
2f940 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2f950 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2f960 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e  assert( pFrom->n
2f970 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a  Free>=iToHdr );.
2f980 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
2f990 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2f9a0 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69 6e 74  mHdr+5]) <= (int
2f9b0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2f9c0 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f   );.  .    /* Co
2f9d0 70 79 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  py the b-tree no
2f9e0 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  de content from 
2f9f0 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61  page pFrom to pa
2fa00 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20 20 69  ge pTo. */.    i
2fa10 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65 28  Data = get2byte(
2fa20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b  &aFrom[iFromHdr+
2fa30 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  5]);.    memcpy(
2fa40 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46  &aTo[iData], &aF
2fa50 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d  rom[iData], pBt-
2fa60 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74  >usableSize-iDat
2fa70 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  a);.    memcpy(&
2fa80 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46  aTo[iToHdr], &aF
2fa90 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70  rom[iFromHdr], p
2faa0 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  From->cellOffset
2fab0 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c   + 2*pFrom->nCel
2fac0 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  l);.  .    /* Re
2fad0 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20  initialize page 
2fae0 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  pTo so that the 
2faf0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2fb00 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72  MemPage structur
2fb10 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68 20 74  e.    ** match t
2fb20 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54 68 65  he new data. The
2fb30 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2fb40 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74 75 61  of pTo can actua
2fb50 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72 0a 20  lly fail under. 
2fb60 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f 62 73     ** fairly obs
2fb70 63 75 72 65 20 63 69 72 63 75 6d 73 74 61 6e 63  cure circumstanc
2fb80 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  es, even though 
2fb90 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  it is a copy of 
2fba0 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  initialized .   
2fbb0 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d 2e 0a   ** page pFrom..
2fbc0 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f 2d 3e      */.    pTo->
2fbd0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
2fbe0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
2fbf0 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69 66 28  ge(pTo);.    if(
2fc00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fc10 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
2fc20 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
2fc30 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
2fc40 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2fc50 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2fc60 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2fc70 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2fc80 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61  ies.    ** for a
2fc90 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f 76 65  ny b-tree or ove
2fca0 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
2fcb0 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e   pTo now contain
2fcc0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 74  s the pointers t
2fcd0 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  o..    */.    if
2fce0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2fcf0 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 73  {.      *pRC = s
2fd00 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
2fd10 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  To);.    }.  }.}
2fd20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2fd30 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75 74  tine redistribut
2fd40 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  es cells on the 
2fd50 69 50 61 72 65 6e 74 49 64 78 27 74 68 20 63 68  iParentIdx'th ch
2fd60 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 0a 2a  ild of pParent.*
2fd70 2a 20 28 68 65 72 65 61 66 74 65 72 20 22 74 68  * (hereafter "th
2fd80 65 20 70 61 67 65 22 29 20 61 6e 64 20 75 70 20  e page") and up 
2fd90 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20 73 6f  to 2 siblings so
2fda0 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
2fdb0 68 61 76 65 20 61 62 6f 75 74 20 74 68 65 0a 2a  have about the.*
2fdc0 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66  * same amount of
2fdd0 20 66 72 65 65 20 73 70 61 63 65 2e 20 55 73 75   free space. Usu
2fde0 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20 73 69  ally a single si
2fdf0 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65 72 20  bling on either 
2fe00 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a 20 70  side of the.** p
2fe10 61 67 65 20 61 72 65 20 75 73 65 64 20 69 6e 20  age are used in 
2fe20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
2fe30 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62 6c 69  hough both sibli
2fe40 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
2fe50 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64 65 20  rom one.** side 
2fe60 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74  if the page is t
2fe70 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61 73 74  he first or last
2fe80 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
2fe90 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70 61 67  rent. If the pag
2fea0 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65 72 20  e .** has fewer 
2feb0 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67 73 20  than 2 siblings 
2fec0 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
2fed0 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
2fee0 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   if the page.** 
2fef0 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  is a root page o
2ff00 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61 20 72  r a child of a r
2ff10 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e 20 61  oot page) then a
2ff20 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62  ll available sib
2ff30 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69 63 69  lings.** partici
2ff40 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
2ff50 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ncing..**.** The
2ff60 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
2ff70 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  ngs of the page 
2ff80 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
2ff90 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
2ffa0 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20 74 77  by .** one or tw
2ffb0 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74  o in an effort t
2ffc0 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61  o keep pages nea
2ffd0 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74  rly full but not
2ffe0 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a 2a 0a   over full. .**.
2fff0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65  ** Note that whe
30000 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
30010 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f  s called, some o
30020 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 74  f the cells on t
30030 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67 68 74  he page.** might
30040 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65   not actually be
30050 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d 50 61   stored in MemPa
30060 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68 69 73  ge.aData[]. This
30070 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69   can happen.** i
30080 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76  f the page is ov
30090 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72 6f 75  erfull. This rou
300a0 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
300b0 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c 6c 6f  t all cells allo
300c0 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  cated.** to the 
300d0 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
300e0 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f 20 4d  lings fit into M
300f0 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 20 62  emPage.aData[] b
30100 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
30110 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
30120 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
30130 67 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69  g the page and i
30140 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63 65 6c  ts siblings, cel
30150 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 73  ls may be.** ins
30160 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20 72 65  erted into or re
30170 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
30180 61 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 72  arent page (pPar
30190 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f 0a 2a  ent). Doing so.*
301a0 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  * may cause the 
301b0 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 62  parent page to b
301c0 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
301d0 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49 66 20  r underfull. If 
301e0 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e 73 2c  this.** happens,
301f0 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
30200 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
30210 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76 6f 6b   caller to invok
30220 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
30230 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   balancing routi
30240 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73 20 70  ne to fix this p
30250 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68 65 20  roblem (see the 
30260 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74 69 6e  balance() routin
30270 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e). .**.** If th
30280 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
30290 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
302a0 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20   it might leave 
302b0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
302c0 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64 20 73  in a corrupted s
302d0 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68 69 73  tate. So if this
302e0 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20   routine fails, 
302f0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f  the database sho
30300 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64  uld.** be rolled
30310 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   back..**.** The
30320 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
30330 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
30340 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20 69 73  , aOvflSpace, is
30350 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a   a pointer to a.
30360 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20 65 6e  ** buffer big en
30370 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f 6e 65  ough to hold one
30380 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c 65 20   page. If while 
30390 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20  inserting cells 
303a0 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a  into the parent.
303b0 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74  ** page (pParent
303c0 29 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  ) the parent pag
303d0 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75  e becomes overfu
303e0 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20  ll, this buffer 
303f0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  is.** used to st
30400 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 27 73  ore the parent's
30410 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
30420 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75   Because this fu
30430 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a  nction inserts.*
30440 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66  * a maximum of f
30450 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c  our divider cell
30460 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
30470 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20  t page, and the 
30480 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20  maximum.** size 
30490 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64  of a cell stored
304a0 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72   within an inter
304b0 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61  nal node is alwa
304c0 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34  ys less than 1/4
304d0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d  .** of the page-
304e0 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53  size, the aOvflS
304f0 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73  pace[] buffer is
30500 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
30510 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67  e large.** enoug
30520 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c  h for all overfl
30530 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20  ow cells..**.** 
30540 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73  If aOvflSpace is
30550 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70   set to a null p
30560 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
30570 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a  ction returns .*
30580 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a  * SQLITE_NOMEM..
30590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
305a0 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20  lance_nonroot(. 
305b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
305c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
305d0 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
305e0 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e  of siblings bein
305f0 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20  g balanced */.  
30600 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20  int iParentIdx, 
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30620 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65  /* Index of "the
30630 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e   page" in pParen
30640 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c  t */.  u8 *aOvfl
30650 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20  Space,          
30660 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73         /* page-s
30670 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
30680 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76  ce for parent ov
30690 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f  fl */.  int isRo
306a0 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ot              
306b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
306c0 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20  if pParent is a 
306d0 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a  root-page */.){.
306e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
306f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30700 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61  * The whole data
30710 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  base */.  int nC
30720 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
30730 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
30740 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43   of cells in apC
30750 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
30760 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20  MaxCells = 0;   
30770 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
30780 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43  ated size of apC
30790 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72  ell, szCell, aFr
307a0 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  om. */.  int nNe
307b0 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  w = 0;          
307c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
307d0 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65  of pages in apNe
307e0 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c  w[] */.  int nOl
307f0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
30800 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
30810 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c  of pages in apOl
30820 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  d[] */.  int i, 
30830 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
30840 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
30850 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
30860 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
30870 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
30880 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
30890 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
308a0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  ] */.  int rc = 
308b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
308c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
308d0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20  n code */.  u16 
308e0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
308f0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
30900 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
30910 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
30920 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
30930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30940 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
30950 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
30960 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
30970 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
30980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
30990 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
309a0 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
309b0 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
309c0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
309d0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
309e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
309f0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
30a00 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
30a10 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
30a20 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
30a30 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
30a40 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
30a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
30a60 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
30a70 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
30a80 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70  */.  int iOvflSp
30a90 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ace = 0;        
30aa0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
30ab0 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53  d byte of aOvflS
30ac0 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pace[] */.  int 
30ad0 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
30ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
30af0 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
30b00 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
30b10 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
30b20 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
30b30 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
30b40 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
30b50 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43  /.  MemPage *apC
30b60 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  opy[NB];        
30b70 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69   /* Private copi
30b80 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61  es of apOld[] pa
30b90 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ges */.  MemPage
30ba0 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   *apNew[NB+2];  
30bb0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61        /* pPage a
30bc0 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c  nd up to NB sibl
30bd0 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e  ings after balan
30be0 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52  cing */.  u8 *pR
30bf0 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20  ight;           
30c00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69         /* Locati
30c10 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20  on in parent of 
30c20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f  right-sibling po
30c30 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61  inter */.  u8 *a
30c40 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20  pDiv[NB-1];     
30c50 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
30c60 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
30c70 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
30c80 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
30c90 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
30ca0 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
30cb0 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
30cc0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
30cd0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
30ce0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
30cf0 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
30d00 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
30d10 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
30d20 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
30d30 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
30d40 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
30d50 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
30d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d70 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
30d80 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
30d90 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
30da0 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20  *aSpace1;       
30db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
30dc0 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66  ce for copies of
30dd0 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
30de0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20  */.  Pgno pgno; 
30df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e00 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f    /* Temp var to
30e10 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75   store a page nu
30e20 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42  mber in */..  pB
30e30 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74  t = pParent->pBt
30e40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
30e50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
30e60 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
30e70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
30e80 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
30e90 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
30ea0 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52  ) );..#if 0.  TR
30eb0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62  ACE(("BALANCE: b
30ec0 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69  egin page %d chi
30ed0 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61  ld of %d\n", pPa
30ee0 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e  ge->pgno, pParen
30ef0 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69  t->pgno));.#endi
30f00 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  f..  /* At this 
30f10 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61  point pParent ma
30f20 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  y have at most o
30f30 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ne overflow cell
30f40 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68  . And if.  ** th
30f50 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  is overflow cell
30f60 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20   is present, it 
30f70 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c  must be the cell
30f80 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65   with .  ** inde
30f90 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68  x iParentIdx. Th
30fa0 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65  is scenario come
30fb0 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69  s about when thi
30fc0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  s function.  ** 
30fd0 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72  is called (indir
30fe0 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69  ectly) from sqli
30ff0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
31000 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
31010 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
31020 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
31030 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  t->nOverflow==1 
31040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
31050 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
31060 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61  =0 || pParent->a
31070 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61  Ovfl[0].idx==iPa
31080 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
31090 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
310a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
310b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
310c0 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
310d0 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
310e0 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
310f0 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
31100 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
31110 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
31120 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
31130 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
31140 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
31150 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
31160 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
31170 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
31180 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
31190 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
311a0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
311b0 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
311c0 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
311d0 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
311e0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
311f0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
31200 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
31210 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
31220 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
31230 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
31240 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
31250 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
31260 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
31270 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
31280 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
31290 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
312a0 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
312b0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
312c0 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
312d0 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
312e0 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65 20 69  nt page, since i
312f0 66 20 61 6e 79 20 65 78 69 73 74 65 64 20 74 68  f any existed th
31300 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68 61 76  ey will.  ** hav
31310 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
31320 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  emoved..  */.  i
31330 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65   = pParent->nOve
31340 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74 2d  rflow + pParent-
31350 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69 3c  >nCell;.  if( i<
31360 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  2 ){.    nxDiv =
31370 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 69   0;.    nOld = i
31380 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  +1;.  }else{.   
31390 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20 69   nOld = 3;.    i
313a0 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d 30  f( iParentIdx==0
313b0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
313c0 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69 76      .      nxDiv
313d0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
313e0 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
313f0 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  i ){.      nxDiv
31400 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c 73   = i-2;.    }els
31410 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20 3d  e{.      nxDiv =
31420 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a 20   iParentIdx-1;. 
31430 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b 0a     }.    i = 2;.
31440 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78 44    }.  if( (i+nxD
31450 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
31460 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d  rflow)==pParent-
31470 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52  >nCell ){.    pR
31480 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74 2d  ight = &pParent-
31490 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
314a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20  hdrOffset+8];.  
314b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68  }else{.    pRigh
314c0 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  t = findCell(pPa
314d0 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
314e0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
314f0 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20  );.  }.  pgno = 
31500 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74 29  get4byte(pRight)
31510 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
31520 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
31530 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
31540 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  o, &apOld[i]);. 
31550 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31560 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c     memset(apOld,
31570 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66   0, (i+1)*sizeof
31580 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
31590 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
315a0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
315b0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
315c0 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
315d0 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
315e0 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28  rflow;.    if( (
315f0 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  i--)==0 ) break;
31600 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78 44 69  ..    if( i+nxDi
31610 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  v==pParent->aOvf
31620 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50 61 72  l[0].idx && pPar
31630 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ent->nOverflow )
31640 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
31650 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66   = pParent->aOvf
31660 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20  l[0].pCell;.    
31670 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
31680 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
31690 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
316a0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
316b0 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
316c0 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76      pParent->nOv
316d0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
316e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44  }else{.      apD
316f0 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
31700 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
31710 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
31720 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e  flow);.      pgn
31730 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
31740 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
31750 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
31760 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
31770 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20  Div[i]);..      
31780 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c  /* Drop the cell
31790 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
317a0 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20   page. apDiv[i] 
317b0 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a  still points to.
317c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c        ** the cel
317d0 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72  l within the par
317e0 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ent, even though
317f0 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f   it has been dro
31800 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54  pped..      ** T
31810 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
31820 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63  use dropping a c
31830 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69  ell only overwri
31840 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20  tes the first.  
31850 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
31860 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69  s of it, and thi
31870 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
31880 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72  not need the fir
31890 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
318a0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69   bytes of the di
318b0 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74  vider cell. So t
318c0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61  he pointer is sa
318d0 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20  fe to use.      
318e0 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20  ** later on.  . 
318f0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
31900 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69   Unless SQLite i
31910 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65  s compiled in se
31920 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
31930 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
31940 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f        ** the dro
31950 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20  pCell() routine 
31960 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
31970 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77  he entire cell w
31980 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20  ith zeroes..    
31990 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
319a0 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63  e, temporarily c
319b0 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74  opy the cell int
319c0 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  o the aOvflSpace
319d0 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66  [].      ** buff
319e0 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63  er. It will be c
319f0 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20  opied out again 
31a00 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61  as soon as the a
31a10 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20  Space[] buffer. 
31a20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63       ** is alloc
31a30 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ated.  */.      
31a40 69 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44  if( pBt->secureD
31a50 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20  elete ){.       
31a60 20 69 6e 74 20 69 4f 66 66 20 3d 20 53 51 4c 49   int iOff = SQLI
31a70 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 61 70  TE_PTR_TO_INT(ap
31a80 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49 54 45  Div[i]) - SQLITE
31a90 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50 61 72  _PTR_TO_INT(pPar
31aa0 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ent->aData);.   
31ab0 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 2b 73       if( (iOff+s
31ac0 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29 70 42  zNew[i])>(int)pB
31ad0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
31ae0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
31af0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31b00 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  KPT;.          m
31b10 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20  emset(apOld, 0, 
31b20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d  (i+1)*sizeof(Mem
31b30 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 20  Page*));.       
31b40 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
31b50 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
31b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31b70 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66 6c 53    memcpy(&aOvflS
31b80 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70 44 69  pace[iOff], apDi
31b90 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b  v[i], szNew[i]);
31ba0 0a 20 20 20 20 20 20 20 20 20 20 61 70 44 69 76  .          apDiv
31bb0 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70 61 63  [i] = &aOvflSpac
31bc0 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65  e[apDiv[i]-pPare
31bd0 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20 20 20  nt->aData];.    
31be0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31bf0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
31c00 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
31c10 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
31c20 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72 63 29  , szNew[i], &rc)
31c30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
31c40 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c 73  * Make nMaxCells
31c50 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 34   a multiple of 4
31c60 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 65   in order to pre
31c70 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20 2a  serve 8-byte.  *
31c80 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a 20  * alignment */. 
31c90 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e 4d   nMaxCells = (nM
31ca0 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33 3b  axCells + 3)&~3;
31cb0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f  ..  /*.  ** Allo
31cc0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d  cate space for m
31cd0 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
31ce0 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42 74 2d  .  */.  k = pBt-
31cf0 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f 55 4e  >pageSize + ROUN
31d00 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
31d10 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74 63 68  e));.  szScratch
31d20 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78 43 65   =.       nMaxCe
31d30 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a 29 20  lls*sizeof(u8*) 
31d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d50 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c 6c 20        /* apCell 
31d60 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78 43 65  */.     + nMaxCe
31d70 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36 29 20  lls*sizeof(u16) 
31d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d90 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c 6c 20        /* szCell 
31da0 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e 70  */.     + pBt->p
31db0 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20 20  ageSize         
31dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31dd0 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65 31        /* aSpace1
31de0 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e 4f 6c   */.     + k*nOl
31df0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
31e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e10 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
31e20 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29 20 2a  opies (apCopy) *
31e30 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c  /.  apCell = sql
31e40 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f  ite3ScratchMallo
31e50 63 28 20 73 7a 53 63 72 61 74 63 68 20 29 3b 20  c( szScratch ); 
31e60 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
31e70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
31e80 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
31e90 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
31ea0 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43 65 6c  nup;.  }.  szCel
31eb0 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c  l = (u16*)&apCel
31ec0 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
31ed0 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a 29 26  aSpace1 = (u8*)&
31ee0 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  szCell[nMaxCells
31ef0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ];.  assert( EIG
31f00 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
31f10 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a 0a 20  T(aSpace1) );.. 
31f20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f   /*.  ** Load po
31f30 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65  inters to all ce
31f40 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70  lls on sibling p
31f50 61 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76  ages and the div
31f60 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
31f70 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61  into the local a
31f80 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20  pCell[] array.  
31f90 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Make copies of t
31fa0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
31fb0 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65  .  ** into space
31fc0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
31fd0 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d  Space1[] and rem
31fe0 6f 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69  ove the the divi
31ff0 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66  der Cells.  ** f
32000 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a  rom pParent..  *
32010 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69  *.  ** If the si
32020 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65  blings are on le
32030 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74  af pages, then t
32040 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  he child pointer
32050 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69  s of the.  ** di
32060 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20  vider cells are 
32070 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68  stripped from th
32080 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74  e cells before t
32090 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20  hey are copied. 
320a0 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31   ** into aSpace1
320b0 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  [].  In this way
320c0 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
320d0 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68  pCell[] are with
320e0 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70  out.  ** child p
320f0 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62  ointers.  If sib
32100 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65  lings are not le
32110 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63  aves, then all c
32120 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65  ell in.  ** apCe
32130 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69  ll[] include chi
32140 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69  ld pointers.  Ei
32150 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65  ther way, all ce
32160 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a  lls in apCell[].
32170 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a    ** are alike..
32180 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f    **.  ** leafCo
32190 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20  rrection:  4 if 
321a0 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
321b0 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20    0 if pPage is 
321c0 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a  not a leaf..  **
321d0 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a         leafData:
321e0 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c    1 if pPage hol
321f0 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20  ds key+data and 
32200 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e  pParent holds on
32210 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20  ly keys..  */.  
32220 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d  leafCorrection =
32230 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66 2a   apOld[0]->leaf*
32240 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
32250 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61 74  apOld[0]->hasDat
32260 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  a;.  for(i=0; i<
32270 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
32280 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20 0a  int limit;.    .
32290 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f      /* Before do
322a0 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  ing anything els
322b0 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20 6f  e, take a copy o
322c0 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67 69  f the i'th origi
322d0 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20 20  nal sibling.    
322e0 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
322f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
32300 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
32310 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
32320 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  r.    ** that th
32330 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  e original pages
32340 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69   since the origi
32350 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62  nal pages will b
32360 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  e in the.    ** 
32370 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67  process of being
32380 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 2a   overwritten.  *
32390 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
323a0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20  Old = apCopy[i] 
323b0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53 70  = (MemPage*)&aSp
323c0 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69  ace1[pBt->pageSi
323d0 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20 6d  ze + k*i];.    m
323e0 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f 6c  emcpy(pOld, apOl
323f0 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d  d[i], sizeof(Mem
32400 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c 64  Page));.    pOld
32410 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a  ->aData = (void*
32420 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20 6d  )&pOld[1];.    m
32430 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61 74  emcpy(pOld->aDat
32440 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61  a, apOld[i]->aDa
32450 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ta, pBt->pageSiz
32460 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20 3d  e);..    limit =
32470 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
32480 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
32490 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65    if( pOld->nOve
324a0 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20  rflow>0 ){.     
324b0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
324c0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
324d0 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
324e0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
324f0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
32500 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
32510 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
32520 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
32530 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
32540 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
32550 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20  nCell]);.       
32560 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
32570 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
32580 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70     u8 *aData = p
32590 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  Old->aData;.    
325a0 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20 3d    u16 maskPage =
325b0 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65 3b   pOld->maskPage;
325c0 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c 4f  .      u16 cellO
325d0 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63 65  ffset = pOld->ce
325e0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  llOffset;.      
325f0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74  for(j=0; j<limit
32600 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
32610 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
32620 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
32630 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     apCell[nCell]
32640 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61 44   = findCellv2(aD
32650 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20 63  ata, maskPage, c
32660 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a 20  ellOffset, j);. 
32670 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
32680 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50  ell] = cellSizeP
32690 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b  tr(pOld, apCell[
326a0 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20 20  nCell]);.       
326b0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
326c0 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a 20  }.    }       . 
326d0 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
326e0 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
326f0 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75       u16 sz = (u
32700 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20  16)szNew[i];.   
32710 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
32720 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
32730 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
32740 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
32750 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  l] = sz;.      p
32760 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
32770 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
32780 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
32790 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
327a0 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32  =pBt->maxLocal+2
327b0 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  3 );.      asser
327c0 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28 69  t( iSpace1 <= (i
327d0 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  nt)pBt->pageSize
327e0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
327f0 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d  (pTemp, apDiv[i]
32800 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70 43  , sz);.      apC
32810 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65  ell[nCell] = pTe
32820 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  mp+leafCorrectio
32830 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
32840 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
32850 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63  =0 || leafCorrec
32860 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
32870 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
32880 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d   szCell[nCell] -
32890 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
328a0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c 64  .      if( !pOld
328b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
328c0 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f    assert( leafCo
328d0 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20  rrection==0 );. 
328e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
328f0 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  Old->hdrOffset==
32900 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 );.        /* 
32910 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65  The right pointe
32920 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
32930 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73  age pOld becomes
32940 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20   the left.      
32950 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20    ** pointer of 
32960 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
32970 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
32980 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  py(apCell[nCell]
32990 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38  , &pOld->aData[8
329a0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ], 4);.      }el
329b0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
329c0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
329d0 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20  on==4 );.       
329e0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
329f0 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
32a00 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
32a10 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c  w any cells smal
32a20 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73  ler than 4 bytes
32a30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  . */.          s
32a40 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34  zCell[nCell] = 4
32a50 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32a60 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b    }.      nCell+
32a70 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  +;.    }.  }..  
32a80 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f  /*.  ** Figure o
32a90 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
32aa0 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f   pages needed to
32ab0 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20   hold all nCell 
32ac0 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72  cells..  ** Stor
32ad0 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e  e this number in
32ae0 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70   "k".  Also comp
32af0 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63  ute szNew[] whic
32b00 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20  h is the total. 
32b10 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20   ** size of all 
32b20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74  cells on the i-t
32b30 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65  h page and cntNe
32b40 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
32b50 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61   index.  ** in a
32b60 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63  pCell[] of the c
32b70 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73  ell that divides
32b80 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67   page i from pag
32b90 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e  e i+1.  .  ** cn
32ba0 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65  tNew[k] should e
32bb0 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a  qual nCell..  **
32bc0 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d  .  ** Values com
32bd0 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  puted by this bl
32be0 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ock:.  **.  **  
32bf0 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20           k: The 
32c00 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
32c10 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20  sibling pages.  
32c20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20  **    szNew[i]: 
32c30 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74  Spaced used on t
32c40 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
32c50 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74  page..  **   cnt
32c60 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e  New[i]: Index in
32c70 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
32c80 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66  Cell[] for the f
32c90 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a  irst cell to.  *
32ca0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  *              t
32cb0 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20  he right of the 
32cc0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
32cd0 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70  e..  ** usableSp
32ce0 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62  ace: Number of b
32cf0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76  ytes of space av
32d00 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20  ailable on each 
32d10 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20  sibling..  ** . 
32d20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63   */.  usableSpac
32d30 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
32d40 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43  ize - 12 + leafC
32d50 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72  orrection;.  for
32d60 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b  (subtotal=k=i=0;
32d70 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
32d80 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d      assert( i<nM
32d90 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73  axCells );.    s
32da0 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c  ubtotal += szCel
32db0 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66  l[i] + 2;.    if
32dc0 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61  ( subtotal > usa
32dd0 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20  bleSpace ){.    
32de0 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
32df0 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69  total - szCell[i
32e00 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b  ];.      cntNew[
32e10 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66  k] = i;.      if
32e20 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d  ( leafData ){ i-
32e30 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f  -; }.      subto
32e40 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b  tal = 0;.      k
32e50 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3e  ++;.      if( k>
32e60 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51 4c  NB+1 ){ rc = SQL
32e70 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
32e80 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ; goto balance_c
32e90 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d 0a  leanup; }.    }.
32ea0 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
32eb0 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
32ec0 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
32ed0 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
32ee0 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
32ef0 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
32f00 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
32f10 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
32f20 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
32f30 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
32f40 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
32f50 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
32f60 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
32f70 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
32f80 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
32f90 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
32fa0 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
32fb0 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
32fc0 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
32fd0 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
32fe0 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
32ff0 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
33000 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
33010 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
33020 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
33030 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
33040 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
33050 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
33060 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
33070 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
33080 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
33090 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
330a0 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
330b0 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
330c0 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
330d0 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
330e0 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
330f0 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
33100 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
33110 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
33120 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
33130 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
33140 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
33150 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
33160 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
33170 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
33180 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
33190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
331a0 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
331b0 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
331c0 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
331d0 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
331e0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
331f0 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
33200 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
33210 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
33220 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
33230 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
33240 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
33250 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
33260 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
33270 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
33280 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
33290 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
332a0 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
332b0 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
332c0 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
332d0 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
332e0 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
332f0 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
33300 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
33310 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
33320 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
33330 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
33340 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
33350 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
33360 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
33370 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
33380 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
33390 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
333a0 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
333b0 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
333c0 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65 20 69  ])>0) or pPage i
333d0 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c  s.  ** a virtual
333e0 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76   root page.  A v
333f0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
33400 20 69 73 20 77 68 65 6e 20 74 68 65 20 72 65 61   is when the rea
33410 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65  l root.  ** page
33420 20 69 73 20 70 61 67 65 20 31 20 61 6e 64 20 77   is page 1 and w
33430 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63  e are the only c
33440 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67  hild of that pag
33450 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
33460 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c  ( cntNew[0]>0 ||
33470 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d   (pParent->pgno=
33480 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  =1 && pParent->n
33490 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 54  Cell==0) );..  T
334a0 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
334b0 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 22  old: %d %d %d  "
334c0 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ,.    apOld[0]->
334d0 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  pgno, .    nOld>
334e0 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70  =2 ? apOld[1]->p
334f0 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c  gno : 0,.    nOl
33500 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d  d>=3 ? apOld[2]-
33510 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a  >pgno : 0.  ));.
33520 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63  .  /*.  ** Alloc
33530 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e  ate k new pages.
33540 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65    Reuse old page
33550 73 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  s where possible
33560 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f  ..  */.  if( apO
33570 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29  ld[0]->pgno<=1 )
33580 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
33590 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
335a0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
335b0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
335c0 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c  pageFlags = apOl
335d0 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  d[0]->aData[0];.
335e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
335f0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
33600 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
33610 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
33620 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
33630 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
33640 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
33650 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
33660 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
33670 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
33680 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
33690 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
336a0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
336b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
336c0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
336d0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
336e0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
336f0 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c  t, &pNew, &pgno,
33700 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20   pgno, 0);.     
33710 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
33720 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
33730 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
33740 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
33750 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  w++;..      /* S
33760 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
33770 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ap entry for the
33780 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
33790 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
337a0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
337b0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
337c0 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70 67 6e  t(pBt, pNew->pgn
337d0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
337e0 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
337f0 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
33800 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
33820 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
33830 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
33840 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
33850 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
33860 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
33870 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
33880 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
33890 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
338a0 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67 65 28  ){.    freePage(
338b0 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29 3b 0a  apOld[i], &rc);.
338c0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
338d0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
338e0 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
338f0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
33900 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
33910 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
33920 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
33930 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
33940 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
33950 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
33960 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
33970 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
33980 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
33990 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
339a0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
339b0 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
339c0 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
339d0 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
339e0 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
339f0 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
33a00 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
33a10 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
33a20 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
33a30 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
33a40 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
33a50 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
33a60 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
33a70 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
33a80 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
33a90 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
33aa0 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
33ab0 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
33ac0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
33ad0 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
33ae0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
33af0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
33b00 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
33b10 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
33b20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
33b30 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
33b40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
33b50 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
33b60 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e  inV = apNew[i]->
33b70 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69  pgno;.    int mi
33b80 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
33b90 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
33ba0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  {.      if( apNe
33bb0 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69  w[j]->pgno<(unsi
33bc0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
33bd0 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
33be0 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70         minV = ap
33bf0 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[j]->pgno;.  
33c00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
33c10 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
33c20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
33c30 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65  .      pT = apNe
33c40 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  w[i];.      apNe
33c50 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
33c60 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
33c70 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20  minI] = pT;.    
33c80 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  }.  }.  TRACE(("
33c90 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25  new: %d(%d) %d(%
33ca0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
33cb0 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20   %d(%d)\n",.    
33cc0 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apNew[0]->pgno, 
33cd0 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e  szNew[0],.    nN
33ce0 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b 31 5d  ew>=2 ? apNew[1]
33cf0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
33d00 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a  >=2 ? szNew[1] :
33d10 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20   0,.    nNew>=3 
33d20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f  ? apNew[2]->pgno
33d30 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
33d40 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
33d50 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70 4e 65    nNew>=4 ? apNe
33d60 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[3]->pgno : 0, 
33d70 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b  nNew>=4 ? szNew[
33d80 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  3] : 0,.    nNew
33d90 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e  >=5 ? apNew[4]->
33da0 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
33db0 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30  5 ? szNew[4] : 0
33dc0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ));..  assert( s
33dd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33de0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
33df0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 70 75  pDbPage) );.  pu
33e00 74 34 62 79 74 65 28 70 52 69 67 68 74 2c 20 61  t4byte(pRight, a
33e10 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67  pNew[nNew-1]->pg
33e20 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  no);..  /*.  ** 
33e30 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74  Evenly distribut
33e40 65 20 74 68 65 20 64 61 74 61 20 69 6e 20 61 70  e the data in ap
33e50 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68  Cell[] across th
33e60 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  e new pages..  *
33e70 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64 65 72  * Insert divider
33e80 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72   cells into pPar
33e90 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61 72 79  ent as necessary
33ea0 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a  ..  */.  j = 0;.
33eb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
33ec0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20  w; i++){.    /* 
33ed0 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77  Assemble the new
33ee0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
33ef0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
33f00 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a  New = apNew[i];.
33f10 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
33f20 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 7a  axCells );.    z
33f30 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70 61  eroPage(pNew, pa
33f40 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20 61 73  geFlags);.    as
33f50 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
33f60 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
33f70 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
33f80 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
33f90 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
33fa0 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
33fb0 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
33fc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
33fd0 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
33fe0 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e  );..    j = cntN
33ff0 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49  ew[i];..    /* I
34000 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61  f the sibling pa
34010 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
34020 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72  ve was not the r
34030 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
34040 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  g,.    ** insert
34050 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20   a divider cell 
34060 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
34070 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
34080 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65 77 2d   assert( i<nNew-
34090 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  1 || j==nCell );
340a0 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65 6c 6c  .    if( j<nCell
340b0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
340c0 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
340d0 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
340e0 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
340f0 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
34100 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
34110 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
34120 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
34130 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
34140 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
34150 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f 76 66  &aOvflSpace[iOvf
34160 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20 20 69  lSpace];.      i
34170 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20 29  f( !pNew->leaf )
34180 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
34190 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38 5d  (&pNew->aData[8]
341a0 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  , pCell, 4);.   
341b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 61     }else if( lea
341c0 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
341d0 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65 20   /* If the tree 
341e0 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74  is a leaf-data t
341f0 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69 62  ree, and the sib
34200 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65 73  lings are leaves
34210 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  , .        ** th
34220 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  en there is no d
34230 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20 61  ivider cell in a
34240 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61 64  pCell[]. Instead
34250 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a 20  , the divider . 
34260 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20 63         ** cell c
34270 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 69  onsists of the i
34280 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
34290 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  he right-most ce
342a0 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20 2a  ll of .        *
342b0 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70 61  * the sibling-pa
342c0 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f  ge assembled abo
342d0 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 20  ve only..       
342e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   */.        Cell
342f0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
34300 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
34310 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
34320 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a  r(pNew, apCell[j
34330 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ], &info);.     
34340 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
34350 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34  ;.        sz = 4
34360 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43   + putVarint(&pC
34370 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65  ell[4], info.nKe
34380 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  y);.        pTem
34390 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
343a0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  se{.        pCel
343b0 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  l -= 4;.        
343c0 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20  /* Obscure case 
343d0 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  for non-leaf-dat
343e0 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20  a trees: If the 
343f0 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61  cell at pCell wa
34400 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65  s.        ** pre
34410 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f  viously stored o
34420 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61  n a leaf node, a
34430 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20  nd its reported 
34440 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20  size was 4.     
34450 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65     ** bytes, the
34460 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c  n it may actuall
34470 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  y be smaller tha
34480 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  n this .        
34490 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50 61 72  ** (see btreePar
344a0 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62  seCellPtr(), 4 b
344b0 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69  ytes is the mini
344c0 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20  mum size of.    
344d0 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29      ** any cell)
344e0 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f  . But it is impo
344f0 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68  rtant to pass th
34500 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74  e correct size t
34510 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  o .        ** in
34520 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72  sertCell(), so r
34530 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20  eparse the cell 
34540 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  now..        **.
34550 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20          ** Note 
34560 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65  that this can ne
34570 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e  ver happen in an
34580 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c   SQLite data fil
34590 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20  e, as all.      
345a0 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61    ** cells are a
345b0 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e  t least 4 bytes.
345c0 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73   It only happens
345d0 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64   in b-trees used
345e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65  .        ** to e
345f0 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c  valuate "IN (SEL
34600 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69  ECT ...)" and si
34610 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20  milar clauses.. 
34620 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
34630 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d    if( szCell[j]=
34640 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =4 ){.          
34650 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65  assert(leafCorre
34660 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20  ction==4);.     
34670 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69       sz = cellSi
34680 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70  zePtr(pParent, p
34690 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Cell);.        }
346a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
346b0 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73 7a 3b  OvflSpace += sz;
346c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
346d0 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
346e0 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
346f0 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63 65 20  ert( iOvflSpace 
34700 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67  <= (int)pBt->pag
34710 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69  eSize );.      i
34720 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
34730 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
34740 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77   sz, pTemp, pNew
34750 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
34760 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34770 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
34780 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
34790 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
347a0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
347b0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
347c0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
347d0 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
347e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
347f0 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
34800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
34810 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
34820 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
34830 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
34840 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
34850 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
34860 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
34870 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
34880 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
34890 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
348a0 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a  zChild, 4);.  }.
348b0 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26  .  if( isRoot &&
348c0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
348d0 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68  =0 && pParent->h
348e0 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b  drOffset<=apNew[
348f0 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  0]->nFree ){.   
34900 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
34910 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
34920 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  now contains no 
34930 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20  cells. The only 
34940 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70  sibling.    ** p
34950 61 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74  age is the right
34960 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
34970 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63  rent. Copy the c
34980 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
34990 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65     ** child page
349a0 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
349b0 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65  , decreasing the
349c0 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20   overall height 
349d0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d  of the.    ** b-
349e0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62  tree structure b
349f0 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64  y one. This is d
34a00 65 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20  escribed as the 
34a10 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77  "balance-shallow
34a20 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61  er".    ** sub-a
34a30 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65  lgorithm in some
34a40 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
34a50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
34a60 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
34a70 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
34a80 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  , the call to co
34a90 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20  pyNodeContent() 
34aa0 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c  .    ** sets all
34ab0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
34ac0 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
34ad0 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69  ng to database i
34ae0 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  mage pages .    
34af0 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ** for which the
34b00 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72   pointer is stor
34b10 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f  ed within the co
34b20 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69  ntent being copi
34b30 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
34b40 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73  * The second ass
34b50 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69  ert below verifi
34b60 65 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c  es that the chil
34b70 64 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67  d page is defrag
34b80 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69  mented.    ** (i
34b90 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74  t must be, as it
34ba0 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73   was just recons
34bb0 74 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73  tructed using as
34bc0 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54  semblePage()). T
34bd0 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d  his.    ** is im
34be0 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70  portant if the p
34bf0 61 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65  arent page happe
34c00 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20  ns to be page 1 
34c10 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
34c20 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a      ** image.  *
34c30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e  /.    assert( nN
34c40 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ew==1 );.    ass
34c50 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e  ert( apNew[0]->n
34c60 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20  Free == .       
34c70 20 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65   (get2byte(&apNe
34c80 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d  w[0]->aData[5])-
34c90 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66  apNew[0]->cellOf
34ca0 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  fset-apNew[0]->n
34cb0 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a  Cell*2) .    );.
34cc0 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74      copyNodeCont
34cd0 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50  ent(apNew[0], pP
34ce0 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20 20 20  arent, &rc);.   
34cf0 20 66 72 65 65 50 61 67 65 28 61 70 4e 65 77 5b   freePage(apNew[
34d00 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65 6c 73  0], &rc);.  }els
34d10 65 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55  e if( ISAUTOVACU
34d20 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 78  UM ){.    /* Fix
34d30 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
34d40 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
34d50 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61 74 20   the cells that 
34d60 77 65 72 65 20 73 68 69 66 74 65 64 20 61 72 6f  were shifted aro
34d70 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54 68 65  und. .    ** The
34d80 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 64  re are several d
34d90 69 66 66 65 72 65 6e 74 20 74 79 70 65 73 20 6f  ifferent types o
34da0 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  f pointer-map en
34db0 74 72 69 65 73 20 74 68 61 74 20 6e 65 65 64 20  tries that need 
34dc0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64 65 61  to.    ** be dea
34dd0 6c 74 20 77 69 74 68 20 62 79 20 74 68 69 73 20  lt with by this 
34de0 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20 6f 66  routine. Some of
34df0 20 74 68 65 73 65 20 68 61 76 65 20 62 65 65 6e   these have been
34e00 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20 62 75   set already, bu
34e10 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 68 61  t.    ** many ha
34e20 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f 6c 6c  ve not. The foll
34e30 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d 6d 61  owing is a summa
34e40 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ry:.    **.    *
34e50 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74 72 69  *   1) The entri
34e60 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
34e70 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  th new sibling p
34e80 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e  ages that were n
34e90 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 73  ot.    **      s
34ea0 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74 68 69  iblings when thi
34eb0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
34ec0 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68 61 76  alled. These hav
34ed0 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20 2a 2a  e already.    **
34ee0 20 20 20 20 20 20 62 65 65 6e 20 73 65 74 2e 20        been set. 
34ef0 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20 74 6f  We don't need to
34f00 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f 6c 64   worry about old
34f10 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77   siblings that w
34f20 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ere.    **      
34f30 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
34f40 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66 72 65  e-list - the fre
34f50 65 50 61 67 65 28 29 20 63 6f 64 65 20 68 61 73  ePage() code has
34f60 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20 20 20   taken care.    
34f70 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  **      of those
34f80 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
34f90 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74 65 72    2) The pointer
34fa0 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73  -map entries ass
34fb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
34fc0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 0a   first overflow.
34fd0 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61 67 65      **      page
34fe0 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77   in any overflow
34ff0 20 63 68 61 69 6e 73 20 75 73 65 64 20 62 79 20   chains used by 
35000 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
35010 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20 2a 2a  s. These .    **
35020 20 20 20 20 20 20 68 61 76 65 20 61 6c 73 6f 20        have also 
35030 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 61 6b  already been tak
35040 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20 74 68  en care of by th
35050 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 20 63  e insertCell() c
35060 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ode..    **.    
35070 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65 20 73  **   3) If the s
35080 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
35090 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
350a0 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  n the child page
350b0 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 20  s of.    **     
350c0 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f 6e   cells stored on
350d0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
350e0 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  es may need to b
350f0 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a  e updated..    *
35100 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20 49 66  *.    **   4) If
35110 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
35120 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  es are not inter
35130 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73  nal intkey nodes
35140 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20 20 2a  , then any.    *
35150 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20  *      overflow 
35160 70 61 67 65 73 20 75 73 65 64 20 62 79 20 74 68  pages used by th
35170 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20 6e 65  ese cells may ne
35180 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
35190 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28 69 6e  .    **      (in
351a0 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f  ternal intkey no
351b0 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74 61 69  des never contai
351c0 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6f 76  n pointers to ov
351d0 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 20  erflow pages).. 
351e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 35     **.    **   5
351f0 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
35200 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
35210 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
35220 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
35230 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65 73 20  **      entries 
35240 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 63 68  for the right-ch
35250 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65 61 63  ild pages of eac
35260 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20 6e 65  h sibling may ne
35270 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 74  ed.    **      t
35280 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
35290 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61 73 65    **.    ** Case
352a0 73 20 31 20 61 6e 64 20 32 20 61 72 65 20 64 65  s 1 and 2 are de
352b0 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65 20 62  alt with above b
352c0 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20 54 68  y other code. Th
352d0 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20 62 6c  e next.    ** bl
352e0 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 63  ock deals with c
352f0 61 73 65 73 20 33 20 61 6e 64 20 34 20 61 6e 64  ases 3 and 4 and
35300 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72 20 74   the one after t
35310 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53 69 6e  hat, case 5. Sin
35320 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  ce.    ** settin
35330 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  g a pointer map 
35340 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c 61 74  entry is a relat
35350 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76 65 20  ively expensive 
35360 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69 73 0a  operation, this.
35370 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79      ** code only
35380 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20 6d 61   sets pointer ma
35390 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 68  p entries for ch
353a0 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ild or overflow 
353b0 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
353c0 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
353d0 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20 70 61  moved between pa
353e0 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d  ges.  */.    Mem
353f0 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
35400 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d 50 61  ew[0];.    MemPa
35410 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
35420 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 4f  y[0];.    int nO
35430 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
35440 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
35450 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20 70 4f  nt iNextOld = pO
35460 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65  ld->nCell + nOve
35470 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
35480 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f 76 65  Overflow = (nOve
35490 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e 61 4f  rflow ? pOld->aO
354a0 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d 31 29  vfl[0].idx : -1)
354b0 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20 20 20  ;.    j = 0;    
354c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
354d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
354e0 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c 69 6e  ent 'old' siblin
354f0 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 6b 20  g page */.    k 
35500 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
35510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35520 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e 65 77   /* Current 'new
35530 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
35540 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
35550 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
35560 20 20 20 20 69 6e 74 20 69 73 44 69 76 69 64 65      int isDivide
35570 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  r = 0;.      whi
35580 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c 64 20  le( i==iNextOld 
35590 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
355a0 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
355b0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
355c0 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
355d0 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20 20 20  cell on old.    
355e0 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
355f0 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20 73 69  age j. If the si
35600 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
35610 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
35620 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
35630 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
35640 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69 76 69  ell i was a divi
35650 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20  der cell. */.   
35660 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f       pOld = apCo
35670 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20  py[++j];.       
35680 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20   iNextOld = i + 
35690 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64  !leafData + pOld
356a0 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e  ->nCell + pOld->
356b0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
356c0 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
356d0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
356e0 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20      nOverflow = 
356f0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
35700 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
35710 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65 61 66  flow = i + !leaf
35720 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76  Data + pOld->aOv
35730 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20  fl[0].idx;.     
35740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44     }.        isD
35750 69 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61  ivider = !leafDa
35760 74 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20  ta;  .      }.. 
35770 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65       assert(nOve
35780 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72  rflow>0 || iOver
35790 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20  flow<i );.      
357a0 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
357b0 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66  <2 || pOld->aOvf
357c0 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e  l[0].idx==pOld->
357d0 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b  aOvfl[1].idx-1);
357e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
357f0 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c  verflow<3 || pOl
35800 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d  d->aOvfl[1].idx=
35810 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e  =pOld->aOvfl[2].
35820 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  idx-1);.      if
35830 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29  ( i==iOverflow )
35840 7b 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  {.        isDivi
35850 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
35860 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f   if( (--nOverflo
35870 77 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w)>0 ){.        
35880 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20    iOverflow++;. 
35890 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
358a0 0a 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 63  ..      if( i==c
358b0 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20  ntNew[k] ){.    
358c0 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
358d0 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
358e0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
358f0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
35900 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   new.        ** 
35910 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20  sibling page k. 
35920 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
35930 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
35940 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
35950 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
35960 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 69  e, then cell i i
35970 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  s a divider cell
35980 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  .  */.        pN
35990 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b  ew = apNew[++k];
359a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
359b0 61 66 44 61 74 61 20 29 20 63 6f 6e 74 69 6e 75  afData ) continu
359c0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
359d0 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20   assert( j<nOld 
359e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
359f0 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20   k<nNew );..    
35a00 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c    /* If the cell
35a10 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20   was originally 
35a20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 28 61 6e  divider cell (an
35a30 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72  d is not now) or
35a40 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65  .      ** an ove
35a50 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69  rflow cell, or i
35a60 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6c  f the cell was l
35a70 6f 63 61 74 65 64 20 6f 6e 20 61 20 64 69 66 66  ocated on a diff
35a80 65 72 65 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20  erent sibling.  
35a90 20 20 20 20 2a 2a 20 70 61 67 65 20 62 65 66 6f      ** page befo
35aa0 72 65 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  re the balancing
35ab0 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
35ac0 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61  er map entries a
35ad0 73 73 6f 63 69 61 74 65 64 0a 20 20 20 20 20 20  ssociated.      
35ae0 2a 2a 20 77 69 74 68 20 61 6e 79 20 63 68 69 6c  ** with any chil
35af0 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  d or overflow pa
35b00 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 75  ges need to be u
35b10 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20  pdated.  */.    
35b20 20 20 69 66 28 20 69 73 44 69 76 69 64 65 72 20    if( isDivider 
35b30 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70  || pOld->pgno!=p
35b40 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
35b50 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f       if( !leafCo
35b60 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
35b70 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
35b80 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70  pBt, get4byte(ap
35b90 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50  Cell[i]), PTRMAP
35ba0 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
35bb0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
35bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
35bd0 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e  szCell[i]>pNew->
35be0 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  minLocal ){.    
35bf0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
35c00 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43  vflPtr(pNew, apC
35c10 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20  ell[i], &rc);.  
35c20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35c30 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
35c40 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
35c50 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
35c60 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
35c70 20 20 20 20 20 20 20 75 33 32 20 6b 65 79 20 3d         u32 key =
35c80 20 67 65 74 34 62 79 74 65 28 26 61 70 4e 65 77   get4byte(&apNew
35c90 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  [i]->aData[8]);.
35ca0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
35cb0 74 28 70 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d  t(pBt, key, PTRM
35cc0 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b  AP_BTREE, apNew[
35cd0 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  i]->pgno, &rc);.
35ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
35cf0 69 66 20 30 0a 20 20 20 20 2f 2a 20 54 68 65 20  if 0.    /* The 
35d00 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
35d10 28 29 20 63 6f 6e 74 61 69 6e 73 20 61 73 73 65  () contains asse
35d20 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
35d30 74 68 61 74 20 76 65 72 69 66 79 20 74 68 61 74  that verify that
35d40 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e  .    ** all poin
35d50 74 65 72 20 6d 61 70 20 70 61 67 65 73 20 61 72  ter map pages ar
35d60 65 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  e set correctly.
35d70 20 54 68 69 73 20 69 73 20 68 65 6c 70 66 75 6c   This is helpful
35d80 20 77 68 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64   while .    ** d
35d90 65 62 75 67 67 69 6e 67 2e 20 54 68 69 73 20 69  ebugging. This i
35da0 73 20 75 73 75 61 6c 6c 79 20 64 69 73 61 62 6c  s usually disabl
35db0 65 64 20 62 65 63 61 75 73 65 20 61 20 63 6f 72  ed because a cor
35dc0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 6d 61  rupt database ma
35dd0 79 0a 20 20 20 20 2a 2a 20 63 61 75 73 65 20 61  y.    ** cause a
35de0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
35df0 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a  ment to fail.  *
35e00 2f 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  /.    ptrmapChec
35e10 6b 50 61 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e  kPages(apNew, nN
35e20 65 77 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 43  ew);.    ptrmapC
35e30 68 65 63 6b 50 61 67 65 73 28 26 70 50 61 72 65  heckPages(&pPare
35e40 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20  nt, 1);.#endif. 
35e50 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
35e60 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b  arent->isInit );
35e70 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
35e80 43 45 3a 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c  CE: finished: ol
35e90 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c  d=%d new=%d cell
35ea0 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%d\n",.       
35eb0 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e     nOld, nNew, n
35ec0 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  Cell));..  /*.  
35ed0 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72  ** Cleanup befor
35ee0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a  e returning..  *
35ef0 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  /.balance_cleanu
35f00 70 3a 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  p:.  sqlite3Scra
35f10 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
35f20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f  .  for(i=0; i<nO
35f30 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65  ld; i++){.    re
35f40 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
35f50 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  i]);.  }.  for(i
35f60 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
35f70 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  {.    releasePag
35f80 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d  e(apNew[i]);.  }
35f90 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
35fa0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
35fb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
35fc0 20 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 20 70   when the root p
35fd0 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 20  age of a b-tree 
35fe0 73 74 72 75 63 74 75 72 65 20 69 73 0a 2a 2a 20  structure is.** 
35ff0 6f 76 65 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e  overfull (has on
36000 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
36010 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a  ow pages)..**.**
36020 20 41 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   A new child pag
36030 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  e is allocated a
36040 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
36050 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
36060 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63  oot.** page, inc
36070 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20  luding overflow 
36080 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f 70 69 65  cells, are copie
36090 64 20 69 6e 74 6f 20 74 68 65 20 63 68 69 6c 64  d into the child
360a0 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  . The root.** pa
360b0 67 65 20 69 73 20 74 68 65 6e 20 6f 76 65 72 77  ge is then overw
360c0 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69  ritten to make i
360d0 74 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  t an empty page 
360e0 77 69 74 68 20 74 68 65 20 72 69 67 68 74 2d 63  with the right-c
360f0 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72  hild .** pointer
36100 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
36110 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   new page..**.**
36120 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
36130 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d  g, all pointer-m
36140 61 70 20 65 6e 74 72 69 65 73 20 63 6f 72 72 65  ap entries corre
36150 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65  sponding to page
36160 73 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6e  s .** that the n
36170 65 77 20 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f  ew child-page no
36180 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  w contains point
36190 65 72 73 20 74 6f 20 61 72 65 20 75 70 64 61 74  ers to are updat
361a0 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79  ed. The.** entry
361b0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
361c0 6f 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  o the new right-
361d0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
361e0 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67   the root.** pag
361f0 65 20 69 73 20 61 6c 73 6f 20 75 70 64 61 74 65  e is also update
36200 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  d..**.** If succ
36210 65 73 73 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64  essful, *ppChild
36220 20 69 73 20 73 65 74 20 74 6f 20 63 6f 6e 74 61   is set to conta
36230 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
36240 6f 20 74 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20  o the child .** 
36250 70 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f  page and SQLITE_
36260 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
36270 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
36280 20 63 61 6c 6c 65 72 20 69 73 20 72 65 71 75 69   caller is requi
36290 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72  red.** to call r
362a0 65 6c 65 61 73 65 50 61 67 65 28 29 20 6f 6e 20  eleasePage() on 
362b0 2a 70 70 43 68 69 6c 64 20 65 78 61 63 74 6c 79  *ppChild exactly
362c0 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20 65 72 72   once. If an err
362d0 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e  or occurs,.** an
362e0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
362f0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 43  eturned and *ppC
36300 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 30  hild is set to 0
36310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36320 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d  balance_deeper(M
36330 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d  emPage *pRoot, M
36340 65 6d 50 61 67 65 20 2a 2a 70 70 43 68 69 6c 64  emPage **ppChild
36350 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
36360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36370 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
36380 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  lue from subproc
36390 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50  edures */.  MemP
363a0 61 67 65 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b  age *pChild = 0;
363b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
363c0 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63  inter to a new c
363d0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 50  hild page */.  P
363e0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20  gno pgnoChild = 
363f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
36400 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
36410 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
36420 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
36430 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70   *pBt = pRoot->p
36440 42 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 42 54  Bt;    /* The BT
36450 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ree */..  assert
36460 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c  ( pRoot->nOverfl
36470 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ow>0 );.  assert
36480 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
36490 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
364a0 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70   );..  /* Make p
364b0 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f 74 20 70  Root, the root p
364c0 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
364d0 65 2c 20 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c  e, writable. All
364e0 6f 63 61 74 65 20 61 20 6e 65 77 20 0a 20 20 2a  ocate a new .  *
364f0 2a 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  * page that will
36500 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
36510 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
36520 50 61 67 65 2e 20 43 6f 70 79 20 74 68 65 20 63  Page. Copy the c
36530 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
36540 74 68 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20  the node stored 
36550 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68  on pRoot into th
36560 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
36570 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
36580 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36590 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
365a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
365b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
365c0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
365d0 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26  ge(pBt,&pChild,&
365e0 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d  pgnoChild,pRoot-
365f0 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f  >pgno,0);.    co
36600 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52  pyNodeContent(pR
36610 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20 26 72 63  oot, pChild, &rc
36620 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  );.    if( ISAUT
36630 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
36640 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
36650 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41  pgnoChild, PTRMA
36660 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e  P_BTREE, pRoot->
36670 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
36680 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  }.  }.  if( rc )
36690 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c 64 20 3d  {.    *ppChild =
366a0 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
366b0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
366c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
366d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
366e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
366f0 65 28 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67  e(pChild->pDbPag
36700 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
36710 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36720 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70  iteable(pRoot->p
36730 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
36740 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65  ert( pChild->nCe
36750 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  ll==pRoot->nCell
36760 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42   );..  TRACE(("B
36770 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f  ALANCE: copy roo
36780 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c  t %d into %d\n",
36790 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43   pRoot->pgno, pC
367a0 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20  hild->pgno));.. 
367b0 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 6f 76 65   /* Copy the ove
367c0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d  rflow cells from
367d0 20 70 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64   pRoot to pChild
367e0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43 68   */.  memcpy(pCh
367f0 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f  ild->aOvfl, pRoo
36800 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d  t->aOvfl, pRoot-
36810 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f  >nOverflow*sizeo
36820 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30  f(pRoot->aOvfl[0
36830 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e  ]));.  pChild->n
36840 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74  Overflow = pRoot
36850 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20  ->nOverflow;..  
36860 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74  /* Zero the cont
36870 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54  ents of pRoot. T
36880 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69  hen install pChi
36890 6c 64 20 61 73 20 74 68 65 20 72 69 67 68 74 2d  ld as the right-
368a0 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f  child. */.  zero
368b0 50 61 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69  Page(pRoot, pChi
368c0 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e  ld->aData[0] & ~
368d0 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74  PTF_LEAF);.  put
368e0 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
368f0 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
36900 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69  fset+8], pgnoChi
36910 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64  ld);..  *ppChild
36920 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74   = pChild;.  ret
36930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
36940 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
36950 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65   that pCur curre
36960 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68  ntly points to h
36970 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64  as just been mod
36980 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65  ified in.** some
36990 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74   way. This funct
369a0 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20  ion figures out 
369b0 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61  if this modifica
369c0 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a  tion means the.*
369d0 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20  * tree needs to 
369e0 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64  be balanced, and
369f0 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65   if so calls the
36a00 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
36a10 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69  ancing .** routi
36a20 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f  ne. Balancing ro
36a30 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  utines are:.**.*
36a40 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  *   balance_quic
36a50 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  k().**   balance
36a60 5f 64 65 65 70 65 72 28 29 0a 2a 2a 20 20 20 62  _deeper().**   b
36a70 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
36a80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
36a90 61 6c 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20  alance(BtCursor 
36aa0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
36ab0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
36ac0 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d  const int nMin =
36ad0 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62   pCur->pBt->usab
36ae0 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a  leSize * 2 / 3;.
36af0 20 20 75 38 20 61 42 61 6c 61 6e 63 65 51 75 69    u8 aBalanceQui
36b00 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75  ckSpace[13];.  u
36b10 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20  8 *pFree = 0;.. 
36b20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
36b30 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c  alance_quick_cal
36b40 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20 54 45 53  led = 0 );.  TES
36b50 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e  TONLY( int balan
36b60 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64  ce_deeper_called
36b70 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a   = 0 );..  do {.
36b80 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
36b90 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
36ba0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
36bb0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  = pCur->apPage[i
36bc0 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20  Page];..    if( 
36bd0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
36be0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
36bf0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
36c00 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
36c10 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
36c20 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e   is overfull. In
36c30 20 74 68 69 73 20 63 61 73 65 20 63 61 6c 6c 20   this case call 
36c40 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  the.        ** b
36c50 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20  alance_deeper() 
36c60 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61  function to crea
36c70 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 66  te a new child f
36c80 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
36c90 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  .        ** and 
36ca0 63 6f 70 79 20 74 68 65 20 63 75 72 72 65 6e 74  copy the current
36cb0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
36cc0 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69 74   root-page to it
36cd0 2e 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  . The.        **
36ce0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
36cf0 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
36d00 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ill balance the 
36d10 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20  child page..    
36d20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20      */ .        
36d30 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65  assert( (balance
36d40 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b  _deeper_called++
36d50 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
36d60 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65  rc = balance_dee
36d70 70 65 72 28 70 50 61 67 65 2c 20 26 70 43 75 72  per(pPage, &pCur
36d80 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20  ->apPage[1]);.  
36d90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
36da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
36db0 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65       pCur->iPage
36dc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
36dd0 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
36de0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   0;.          pC
36df0 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30  ur->aiIdx[1] = 0
36e00 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
36e10 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
36e20 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  [1]->nOverflow )
36e30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36e40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
36e50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
36e60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
36e70 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
36e80 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  0 && pPage->nFre
36e90 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20  e<=nMin ){.     
36ea0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
36eb0 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  e{.      MemPage
36ec0 20 2a 20 63 6f 6e 73 74 20 70 50 61 72 65 6e 74   * const pParent
36ed0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
36ee0 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20  iPage-1];.      
36ef0 69 6e 74 20 63 6f 6e 73 74 20 69 49 64 78 20 3d  int const iIdx =
36f00 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
36f10 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63  ge-1];..      rc
36f20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
36f30 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
36f40 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
36f50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36f60 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
36f70 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
36f80 4e 43 45 0a 20 20 20 20 20 20 20 20 69 66 28 20  NCE.        if( 
36f90 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20  pPage->hasData. 
36fa0 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
36fb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20  ->nOverflow==1. 
36fc0 20 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65          && pPage
36fd0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
36fe0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20  pPage->nCell.   
36ff0 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74        && pParent
37000 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20  ->pgno!=1.      
37010 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e     && pParent->n
37020 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20  Cell==iIdx.     
37030 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
37040 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f  /* Call balance_
37050 71 75 69 63 6b 28 29 20 74 6f 20 63 72 65 61 74  quick() to creat
37060 65 20 61 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  e a new sibling 
37070 6f 66 20 70 50 61 67 65 20 6f 6e 20 77 68 69 63  of pPage on whic
37080 68 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  h.          ** t
37090 6f 20 73 74 6f 72 65 20 74 68 65 20 6f 76 65 72  o store the over
370a0 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e  flow cell. balan
370b0 63 65 5f 71 75 69 63 6b 28 29 20 69 6e 73 65 72  ce_quick() inser
370c0 74 73 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20  ts a new cell.  
370d0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20          ** into 
370e0 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d  pParent, which m
370f0 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74  ay cause pParent
37100 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66 20 74 68   overflow. If th
37110 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
37120 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6e 65 78  happens, the nex
37130 74 20 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20  t interation of 
37140 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
37150 20 62 61 6c 61 6e 63 65 20 70 50 61 72 65 6e 74   balance pParent
37160 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75   .          ** u
37170 73 65 20 65 69 74 68 65 72 20 62 61 6c 61 6e 63  se either balanc
37180 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62  e_nonroot() or b
37190 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29 2e  alance_deeper().
371a0 20 55 6e 74 69 6c 20 74 68 69 73 0a 20 20 20 20   Until this.    
371b0 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
371c0 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  , the overflow c
371d0 65 6c 6c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ell is stored in
371e0 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69   the aBalanceQui
371f0 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20  ckSpace[].      
37200 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a      ** buffer. .
37210 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
37220 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 70 75         ** The pu
37230 72 70 6f 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  rpose of the fol
37240 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 20  lowing assert() 
37250 69 73 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74  is to check that
37260 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20 20 20 20   only a.        
37270 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c    ** single call
37280 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69 63   to balance_quic
37290 6b 28 29 20 69 73 20 6d 61 64 65 20 66 6f 72 20  k() is made for 
372a0 65 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69  each call to thi
372b0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  s.          ** f
372c0 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73  unction. If this
372d0 20 77 65 72 65 20 6e 6f 74 20 76 65 72 69 66 69   were not verifi
372e0 65 64 2c 20 61 20 73 75 62 74 6c 65 20 62 75 67  ed, a subtle bug
372f0 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73 65   involving reuse
37300 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
37310 20 74 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69   the aBalanceQui
37320 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67 68 74 20  ckSpace[] might 
37330 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20  sneak in..      
37340 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
37350 20 61 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63   assert( (balanc
37360 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b  e_quick_called++
37370 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
37380 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71    rc = balance_q
37390 75 69 63 6b 28 70 50 61 72 65 6e 74 2c 20 70 50  uick(pParent, pP
373a0 61 67 65 2c 20 61 42 61 6c 61 6e 63 65 51 75 69  age, aBalanceQui
373b0 63 6b 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20  ckSpace);.      
373c0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
373d0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
373e0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
373f0 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  se, call balance
37400 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65  _nonroot() to re
37410 64 69 73 74 72 69 62 75 74 65 20 63 65 6c 6c 73  distribute cells
37420 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
37430 74 77 65 65 6e 20 70 50 61 67 65 20 61 6e 64 20  tween pPage and 
37440 75 70 20 74 6f 20 32 20 6f 66 20 69 74 73 20 73  up to 2 of its s
37450 69 62 6c 69 6e 67 20 70 61 67 65 73 2e 20 54 68  ibling pages. Th
37460 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20  is involves.    
37470 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69        ** modifyi
37480 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
37490 6f 66 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63  of pParent, whic
374a0 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72  h may cause pPar
374b0 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20  ent to.         
374c0 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   ** become overf
374d0 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
374e0 2e 20 54 68 65 20 6e 65 78 74 20 69 74 65 72 61  . The next itera
374f0 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
37500 6f 6f 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  oop.          **
37510 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68   will balance th
37520 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
37530 20 63 6f 72 72 65 63 74 20 74 68 69 73 2e 0a 20   correct this.. 
37540 20 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20           ** .   
37550 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
37560 20 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63   parent page bec
37570 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74  omes overfull, t
37580 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
37590 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20 20 20 20   or cells.      
375a0 20 20 20 20 2a 2a 20 61 72 65 20 73 74 6f 72 65      ** are store
375b0 64 20 69 6e 20 74 68 65 20 70 53 70 61 63 65 20  d in the pSpace 
375c0 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
375d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 6c   immediately bel
375e0 6f 77 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ow. .          *
375f0 2a 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 69  * A subsequent i
37600 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
37610 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61  do-loop will dea
37620 6c 20 77 69 74 68 20 74 68 69 73 20 62 79 0a 20  l with this by. 
37630 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c           ** call
37640 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  ing balance_nonr
37650 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63 65 5f 64  oot() (balance_d
37660 65 65 70 65 72 28 29 20 6d 61 79 20 62 65 20 63  eeper() may be c
37670 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a 20 20 20  alled first,.   
37680 20 20 20 20 20 20 20 2a 2a 20 62 75 74 20 69 74         ** but it
37690 20 64 6f 65 73 6e 27 74 20 64 65 61 6c 20 77 69   doesn't deal wi
376a0 74 68 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  th overflow cell
376b0 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20 74  s - just moves t
376c0 68 65 6d 20 74 6f 20 61 0a 20 20 20 20 20 20 20  hem to a.       
376d0 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20     ** different 
376e0 70 61 67 65 29 2e 20 4f 6e 63 65 20 74 68 69 73  page). Once this
376f0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
37700 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
37710 6f 6f 74 28 29 20 0a 20 20 20 20 20 20 20 20 20  oot() .         
37720 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74 65   ** has complete
37730 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  d, it is safe to
37740 20 72 65 6c 65 61 73 65 20 74 68 65 20 70 53 70   release the pSp
37750 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20  ace buffer used 
37760 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  by.          ** 
37770 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 61 6c  the previous cal
37780 6c 2c 20 61 73 20 74 68 65 20 6f 76 65 72 66 6c  l, as the overfl
37790 6f 77 20 63 65 6c 6c 20 64 61 74 61 20 77 69 6c  ow cell data wil
377a0 6c 20 68 61 76 65 20 62 65 65 6e 20 0a 20 20 20  l have been .   
377b0 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64         ** copied
377c0 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65   either into the
377d0 20 62 6f 64 79 20 6f 66 20 61 20 64 61 74 61 62   body of a datab
377e0 61 73 65 20 70 61 67 65 20 6f 72 20 69 6e 74 6f  ase page or into
377f0 20 74 68 65 20 6e 65 77 0a 20 20 20 20 20 20 20   the new.       
37800 20 20 20 2a 2a 20 70 53 70 61 63 65 20 62 75 66     ** pSpace buf
37810 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68  fer passed to th
37820 65 20 6c 61 74 74 65 72 20 63 61 6c 6c 20 74 6f  e latter call to
37830 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37840 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ()..          */
37850 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 70  .          u8 *p
37860 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50  Space = sqlite3P
37870 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e  ageMalloc(pCur->
37880 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
37890 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62            rc = b
378a0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
378b0 50 61 72 65 6e 74 2c 20 69 49 64 78 2c 20 70 53  Parent, iIdx, pS
378c0 70 61 63 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b  pace, iPage==1);
378d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
378e0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
378f0 20 20 20 20 2f 2a 20 49 66 20 70 46 72 65 65 20      /* If pFree 
37900 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
37910 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 70 53  points to the pS
37920 70 61 63 65 20 62 75 66 66 65 72 20 75 73 65 64  pace buffer used
37930 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
37940 20 62 79 20 61 20 70 72 65 76 69 6f 75 73 20 63   by a previous c
37950 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e  all to balance_n
37960 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f  onroot(). Its co
37970 6e 74 65 6e 74 73 20 61 72 65 0a 20 20 20 20 20  ntents are.     
37980 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74         ** now st
37990 6f 72 65 64 20 65 69 74 68 65 72 20 6f 6e 20 72  ored either on r
379a0 65 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  eal database pag
379b0 65 73 20 6f 72 20 77 69 74 68 69 6e 20 74 68 65  es or within the
379c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
379d0 20 6e 65 77 20 70 53 70 61 63 65 20 62 75 66 66   new pSpace buff
379e0 65 72 2c 20 73 6f 20 69 74 20 6d 61 79 20 62 65  er, so it may be
379f0 20 73 61 66 65 6c 79 20 66 72 65 65 64 20 68 65   safely freed he
37a00 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re. */.         
37a10 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72     sqlite3PageFr
37a20 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ee(pFree);.     
37a30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
37a40 20 20 2f 2a 20 54 68 65 20 70 53 70 61 63 65 20    /* The pSpace 
37a50 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65 20 66  buffer will be f
37a60 72 65 65 64 20 61 66 74 65 72 20 74 68 65 20 6e  reed after the n
37a70 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ext call to.    
37a80 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
37a90 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a  _nonroot(), or j
37aa0 75 73 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  ust before this 
37ab0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
37ac0 2c 20 77 68 69 63 68 65 76 65 72 0a 20 20 20 20  , whichever.    
37ad0 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66        ** comes f
37ae0 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  irst. */.       
37af0 20 20 20 70 46 72 65 65 20 3d 20 70 53 70 61 63     pFree = pSpac
37b00 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
37b10 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67     }..      pPag
37b20 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
37b30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
37b40 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
37b50 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61  f the do-loop ba
37b60 6c 61 6e 63 65 73 20 74 68 65 20 70 61 72 65 6e  lances the paren
37b70 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  t page. */.     
37b80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
37b90 67 65 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ge);.      pCur-
37ba0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >iPage--;.    }.
37bb0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
37bc0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66  LITE_OK );..  if
37bd0 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
37be0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
37bf0 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
37c00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
37c10 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
37c20 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42  ecord into the B
37c30 54 72 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69  Tree.  The key i
37c40 73 20 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79  s given by (pKey
37c50 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68  ,nKey).** and th
37c60 65 20 64 61 74 61 20 69 73 20 67 69 76 65 6e 20  e data is given 
37c70 62 79 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29  by (pData,nData)
37c80 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73  .  The cursor is
37c90 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a   used only to.**
37ca0 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 61 62   define what tab
37cb0 6c 65 20 74 68 65 20 72 65 63 6f 72 64 20 73 68  le the record sh
37cc0 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64  ould be inserted
37cd0 20 69 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73   into.  The curs
37ce0 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f  or.** is left po
37cf0 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64  inting at a rand
37d00 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  om location..**.
37d10 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59  ** For an INTKEY
37d20 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65   table, only the
37d30 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74   nKey value of t
37d40 68 65 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20  he key is used. 
37d50 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f   pKey is.** igno
37d60 72 65 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f  red.  For a ZERO
37d70 44 41 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20  DATA table, the 
37d80 70 44 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20  pData and nData 
37d90 61 72 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64  are both ignored
37da0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
37db0 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
37dc0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
37dd0 20 74 68 65 6e 20 61 20 73 75 63 63 65 73 73 66   then a successf
37de0 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f  ul call to.** Mo
37df0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
37e00 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43  o seek cursor pC
37e10 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65  ur to (pKey, nKe
37e20 79 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  y) has already.*
37e30 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64  * been performed
37e40 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20  . seekResult is 
37e50 74 68 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  the search resul
37e60 74 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65  t returned (a ne
37e70 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72  gative.** number
37e80 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20   if pCur points 
37e90 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
37ea0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
37eb0 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f   (pKey, nKey), o
37ec0 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76 65 20  r.** a positive 
37ed0 76 61 6c 75 65 20 69 66 20 70 43 75 72 20 70 6f  value if pCur po
37ee0 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72 79 20  ints at an etry 
37ef0 74 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74  that is larger t
37f00 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e  han .** (pKey, n
37f10 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Key)). .**.** If
37f20 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20   the seekResult 
37f30 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
37f40 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
37f50 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
37f60 73 20 74 68 61 74 0a 2a 2a 20 63 75 72 73 6f 72  s that.** cursor
37f70 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
37f80 67 20 61 74 20 74 68 65 20 65 78 69 73 74 69 6e  g at the existin
37f90 67 20 63 6f 70 79 20 6f 66 20 61 20 72 6f 77 20  g copy of a row 
37fa0 74 68 61 74 20 69 73 20 74 6f 20 62 65 0a 2a 2a  that is to be.**
37fb0 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20 49   overwritten.  I
37fc0 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74  f the seekResult
37fd0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
37fe0 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43 75   then cursor pCu
37ff0 72 20 6d 61 79 0a 2a 2a 20 70 6f 69 6e 74 20 74  r may.** point t
38000 6f 20 61 6e 79 20 65 6e 74 72 79 20 6f 72 20 74  o any entry or t
38010 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20 61 6c  o no entry at al
38020 6c 20 61 6e 64 20 73 6f 20 74 68 69 73 20 66 75  l and so this fu
38030 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20 73 65  nction has to se
38040 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  ek.** the cursor
38050 20 62 65 66 6f 72 65 20 74 68 65 20 6e 65 77 20   before the new 
38060 6b 65 79 20 63 61 6e 20 62 65 20 69 6e 73 65 72  key can be inser
38070 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
38080 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
38090 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
380a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
380b0 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
380c0 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
380d0 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
380e0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
380f0 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
38100 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
38110 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
38120 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
38130 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
38140 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
38150 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
38160 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
38170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38180 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
38190 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20  f extra 0 bytes 
381a0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
381b0 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  a */.  int appen
381c0 64 42 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  dBias,          
381d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
381e0 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
381f0 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 69  an append */.  i
38200 6e 74 20 73 65 65 6b 52 65 73 75 6c 74 20 20 20  nt seekResult   
38210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38220 20 52 65 73 75 6c 74 20 6f 66 20 70 72 69 6f 72   Result of prior
38230 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28   MovetoUnpacked(
38240 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  ) call */.){.  i
38250 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63  nt rc;.  int loc
38260 20 3d 20 73 65 65 6b 52 65 73 75 6c 74 3b 20 20   = seekResult;  
38270 20 20 20 20 20 20 20 20 2f 2a 20 2d 31 3a 20 62          /* -1: b
38280 65 66 6f 72 65 20 64 65 73 69 72 65 64 20 6c 6f  efore desired lo
38290 63 61 74 69 6f 6e 20 20 2b 31 3a 20 61 66 74 65  cation  +1: afte
382a0 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  r */.  int szNew
382b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 64 78 3b   = 0;.  int idx;
382c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
382d0 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  e;.  Btree *p = 
382e0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
382f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
38300 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  p->pBt;.  unsign
38310 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c  ed char *oldCell
38320 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
38330 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a  r *newCell = 0;.
38340 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
38350 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
38360 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  T ){.    assert(
38370 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21   pCur->skipNext!
38380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
38390 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
383a0 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  kipNext;.  }..  
383b0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
383c0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
383d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
383e0 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d  ->wrFlag && pBt-
383f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
38400 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 21  TRANS_WRITE && !
38410 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
38420 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
38430 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
38440 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  ck(p, pCur->pgno
38450 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79  Root, pCur->pKey
38460 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a  Info!=0, 2) );..
38470 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
38480 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
38490 62 65 65 6e 20 63 6f 6e 73 69 73 74 65 6e 74 2e  been consistent.
384a0 20 49 66 20 74 68 69 73 20 63 7