/ Hex Artifact Content
Login

Artifact 7cf38b094359e7ac7ec554a23f22d0afa3cbaceb:


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 20 20 63   a malloc */.  c
5760: 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a  har *pFree = 0;.
5770: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
5780: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
5790: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
57a0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
57b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
57c0: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
57d0: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
57e0: 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c  KeyInfo, aSpace,
57f0: 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c   sizeof(aSpace),
5800: 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20   &pFree.    );. 
5810: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
5820: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
5830: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c  E_NOMEM;.    sql
5840: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
5850: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
5860: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
5870: 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  pKey, pIdxKey);.
5880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
5890: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
58a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
58b0: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
58c0: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
58d0: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
58e0: 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ;.  if( pFree ){
58f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5900: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
5910: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
5920: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5930: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
5940: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
5950: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
5960: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
5970: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
5980: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
5990: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
59a0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
59b0: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
59c0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
59d0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
59e0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
59f0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5a00: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
5a10: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
5a20: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
5a30: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5a40: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
5a50: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
5a60: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
5a70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
5a80: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
5a90: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
5aa0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
5ab0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
5ac0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5ad0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
5ae0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
5af0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5b00: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
5b10: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b20: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
5b30: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
5b40: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
5b50: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5b60: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
5b70: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
5b80: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
5b90: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
5ba0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20  ur->skipNext);. 
5bb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5bc0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
5bd0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
5be0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
5bf0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
5c00: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
5c10: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
5c20: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
5c30: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
5c40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5c50: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
5c60: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5c70: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
5c80: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
5c90: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
5ca0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
5cb0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5cc0: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
5cd0: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
5ce0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
5cf0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
5d00: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
5d10: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
5d20: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
5d30: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
5d40: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
5d50: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
5d60: 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  are pointing.** 
5d70: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
5d80: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
5d90: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  m..**.** This ro
5da0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e  utine returns an
5db0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73   error code if s
5dc0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5dd0: 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74  ong.  The.** int
5de0: 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20  eger *pHasMoved 
5df0: 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66  is set to one if
5e00: 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
5e10: 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e  moved and 0 if n
5e20: 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
5e30: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
5e40: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
5e50: 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d  pCur, int *pHasM
5e60: 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
5e70: 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ..  rc = restore
5e80: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5e90: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
5ea0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5eb0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
5ec0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
5ed0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
5ee0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ef0: 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29  r->skipNext!=0 )
5f00: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5f10: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5f20: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5f30: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5f40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5f50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5f60: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
5f70: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
5f80: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
5f90: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
5fa0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
5fb0: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
5fc0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
5fd0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
5fe0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
5ff0: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
6000: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
6010: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
6020: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
6030: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
6040: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
6050: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
6060: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
6070: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
6080: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
6090: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
60a0: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
60b0: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
60c0: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
60d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
60e0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
60f0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
6100: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
6110: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
6120: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6130: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6140: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
6150: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
6160: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6170: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
6180: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
6190: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
61a0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
61b0: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
61c0: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
61d0: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
61e0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
61f0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
6200: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
6210: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
6220: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
6230: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
6240: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6250: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
6260: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
6270: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6280: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
6290: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
62a0: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
62b0: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
62c0: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
62d0: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
62e0: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
62f0: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
6300: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
6310: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
6320: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
6330: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
6340: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6350: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
6360: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
6370: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6380: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
6390: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
63a0: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
63b0: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
63c0: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
63d0: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
63e0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
63f0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
6400: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
6410: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
6420: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
6430: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
6440: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
6450: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
6460: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
6470: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
6480: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6490: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
64a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
64b0: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
64c0: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
64d0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
64e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
64f0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6500: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
6510: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
6520: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
6530: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
6540: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
6550: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
6560: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
6570: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
6580: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
6590: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
65a0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
65b0: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
65c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
65d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
65e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
65f0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
6600: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6610: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6620: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6630: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6640: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6650: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6660: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
6670: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
6680: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
6690: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
66a0: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
66b0: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
66c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
66d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
66e0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
66f0: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
6700: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6710: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6720: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
6730: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6740: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6750: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6760: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6770: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
6780: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6790: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
67a0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
67b0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
67c0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
67d0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
67e0: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
67f0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6800: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6810: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6820: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6830: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6840: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6850: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6860: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6870: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
6880: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
6890: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
68a0: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
68b0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
68c0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
68d0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
68e0: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
68f0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6900: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6910: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6920: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6930: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6940: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6950: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6960: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6970: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6980: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
6990: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
69a0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
69b0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
69c0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
69d0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
69e0: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
69f0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6a00: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6a10: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6a20: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6a30: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6a40: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6a50: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6a60: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6a70: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6a80: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
6a90: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6aa0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6ab0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
6ac0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
6ad0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6ae0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6af0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6b00: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6b10: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6b20: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6b30: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6b40: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6b50: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6b60: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6b70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6b80: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
6b90: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6ba0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
6bb0: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
6bc0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
6bd0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6be0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
6bf0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
6c00: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6c20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6c30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
6c40: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
6c50: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
6c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
6c70: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
6c80: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
6c90: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
6ca0: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
6cb0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6cc0: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
6cd0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
6ce0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
6cf0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
6d00: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
6d10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6d20: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
6d30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
6d40: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
6d50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6d60: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
6d70: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
6d80: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
6d90: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
6da0: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
6db0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6dc0: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
6dd0: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
6de0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
6df0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
6e00: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
6e10: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
6e20: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
6e30: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
6e40: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
6e50: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
6e60: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6e70: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
6e80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6e90: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
6ea0: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
6eb0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
6ec0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
6ed0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
6ee0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
6ef0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
6f00: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
6f10: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
6f20: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
6f30: 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d  e findCellv2(D,M
6f40: 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32  ,O,I) (D+(M&get2
6f50: 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29  byte(D+(O+2*(I))
6f60: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
6f70: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
6f80: 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43  version of findC
6f90: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
6fa0: 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68   for.** pages th
6fb0: 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76  at do contain ov
6fc0: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
6fd0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
6fe0: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
6ff0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
7000: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
7010: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7020: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7030: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
7040: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
7050: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
7060: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
7070: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75   int k;.    stru
7080: 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f  ct _OvflCell *pO
7090: 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d  vfl;.    pOvfl =
70a0: 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69   &pPage->aOvfl[i
70b0: 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c  ];.    k = pOvfl
70c0: 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b  ->idx;.    if( k
70d0: 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  <=iCell ){.     
70e0: 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b   if( k==iCell ){
70f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7100: 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20  pOvfl->pCell;.  
7110: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
7120: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
7130: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
7140: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
7150: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
7160: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
7170: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
7180: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
7190: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
71a0: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
71b0: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
71c0: 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65  ion.  btreeParse
71d0: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
71e0: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
71f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7200: 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61  ment and btreePa
7210: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
7220: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
7230: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
7240: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
7250: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
7260: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
7270: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
7280: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
7290: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
72a0: 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65  tead of.** btree
72b0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20  ParseCellPtr(). 
72c0: 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69  Using some compi
72d0: 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  lers, this will 
72e0: 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74  be faster..*/.st
72f0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7300: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
7310: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
7320: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
7330: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
7340: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
7350: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7360: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
7370: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
7380: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
7390: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
73a0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
73b0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  ure */.){.  u16 
73c0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
73d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79      /* Number by
73e0: 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74  tes in cell cont
73f0: 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ent header */.  
7400: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
7410: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7420: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
7430: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
7440: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7450: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
7460: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
7470: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c  ;..  pInfo->pCel
7480: 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73  l = pCell;.  ass
7490: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
74a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
74b0: 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70  af==1 );.  n = p
74c0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
74d0: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ze;.  assert( n=
74e0: 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66  =4-4*pPage->leaf
74f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
7500: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69  >intKey ){.    i
7510: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
7520: 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  a ){.      n += 
7530: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
7540: 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ll[n], nPayload)
7550: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7560: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
7570: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
7580: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
7590: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
75a0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
75b0: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
75c0: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
75d0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
75e0: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
75f0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
7600: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
7610: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
7620: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7630: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
7640: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
7650: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
7660: 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28  = n;.  testcase(
7670: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
7680: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
7690: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
76a0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
76b0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c  cal+1 );.  if( l
76c0: 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d  ikely(nPayload<=
76d0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29  pPage->maxLocal)
76e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
76f0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
7700: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
7710: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
7720: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
7730: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
7740: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
7750: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
7760: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66  */.    if( (pInf
7770: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
7780: 28 6e 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20  (n+nPayload))<4 
7790: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
77a0: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
77b0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
77c0: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
77d0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
77e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
77f0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
7800: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
7810: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
7820: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
7830: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
7840: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
7850: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
7860: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
7870: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
7880: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7890: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
78a0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
78b0: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
78c0: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
78d0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
78e0: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
78f0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
7900: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
7910: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
7920: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
7930: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
7940: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
7950: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
7960: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
7970: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
7980: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
7990: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
79a0: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
79b0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
79c0: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
79d0: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
79e0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
79f0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7a00: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
7a10: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
7a20: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7a30: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7a40: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
7a50: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
7a60: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
7a70: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
7a80: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
7a90: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7aa0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
7ab0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7ac0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
7ad0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
7ae0: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
7af0: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
7b00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7b10: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
7b20: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
7b30: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
7b40: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
7b50: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
7b60: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
7b70: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
7b80: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
7b90: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
7ba0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7bb0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7bc0: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
7bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
7be0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
7bf0: 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  16)(pInfo->nLoca
7c00: 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66  l + n);.    pInf
7c10: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
7c20: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
7c30: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70  .  }.}.#define p
7c40: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
7c50: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a  iCell, pInfo) \.
7c60: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
7c70: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
7c80: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
7c90: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
7ca0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  ).static void bt
7cb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
7cc0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
7cd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7ce0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
7cf0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
7d00: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
7d10: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
7d20: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
7d30: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
7d40: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
7d50: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
7d60: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
7d70: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
7d80: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
7d90: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
7da0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
7db0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
7dc0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
7dd0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
7de0: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
7df0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
7e00: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
7e10: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
7e20: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
7e30: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
7e40: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
7e50: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
7e60: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
7e70: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
7e80: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
7e90: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
7ea0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
7eb0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
7ec0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
7ed0: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
7ee0: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
7ef0: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
7f00: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
7f10: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
7f20: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
7f30: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
7f40: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
7f50: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
7f60: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
7f70: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
7f80: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
7f90: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
7fa0: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
7fb0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
7fc0: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
7fd0: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
7fe0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
7ff0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
8000: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
8010: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
8020: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
8030: 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72  info;.  btreePar
8040: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
8050: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
8060: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
8070: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
8080: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
8090: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
80a0: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
80b0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
80c0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
80d0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
80e0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
80f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8100: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
8110: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
8120: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
8130: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
8140: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
8150: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
8160: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
8170: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
8180: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
8190: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
81a0: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
81b0: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
81c0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
81d0: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
81e0: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
81f0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
8200: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
8210: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
8220: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
8230: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8240: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8250: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8260: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8270: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8280: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
8290: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
82a0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
82b0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
82c0: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
82d0: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
82e0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
82f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8300: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
8310: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8320: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8330: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8340: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8350: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8360: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
8370: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8380: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
8390: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
83a0: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
83b0: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
83c0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
83d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
83e0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
83f0: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
8400: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
8410: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
8420: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
8430: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
8440: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
8450: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
8460: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8470: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
8480: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
8490: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
84a0: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
84b0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
84c0: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
84d0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
84e0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
84f0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
8500: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
8510: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
8520: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
8530: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
8540: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8550: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
8560: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
8570: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
8580: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
8590: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
85a0: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
85b0: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
85c0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
85d0: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
85e0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
85f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8600: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8610: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8620: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
8630: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
8640: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
8650: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
8660: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
8670: 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
8680: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
8690: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
86a0: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
86b0: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
86c0: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
86d0: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
86e0: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
86f0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
8700: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
8710: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
8720: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
8730: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
8740: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
8750: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
8760: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
8770: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
8780: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
8790: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
87a0: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
87b0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
87c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
87d0: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
87e0: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
87f0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
8800: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
8810: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
8820: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
8830: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
8840: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
8850: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
8860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
8870: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
8880: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8890: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
88a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
88b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
88c0: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
88d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
88e0: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
88f0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
8900: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
8910: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
8920: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
8930: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
8960: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
8970: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
89a0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
89b0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
89c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
89d0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
89e0: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
89f0: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8a10: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
8a20: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
8a30: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
8a60: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
8a70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8a80: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
8a90: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
8aa0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8ab0: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
8ac0: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
8ad0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
8ae0: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
8af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8b00: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
8b10: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
8b20: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
8b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
8b40: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
8b50: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
8b60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8b70: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
8b80: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
8b90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8ba0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
8bb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8bc0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
8bd0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
8be0: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
8bf0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
8c00: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
8c10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8c20: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8c30: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
8c40: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
8c50: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
8c60: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
8c70: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
8c80: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
8c90: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
8ca0: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
8cb0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
8cc0: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
8cd0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
8ce0: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
8cf0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
8d00: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
8d10: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
8d20: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
8d30: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
8d40: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
8d50: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72  memcpy(&temp[cbr
8d60: 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
8d70: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62   usableSize - cb
8d80: 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  rk);.  cbrk = us
8d90: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
8da0: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
8db0: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
8dc0: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
8dd0: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
8de0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
8df0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
8e00: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
8e10: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
8e20: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
8e30: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
8e40: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
8e50: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
8e60: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
8e70: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
8e80: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
8e90: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
8ea0: 20 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   );.#if !defined
8eb0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
8ec0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
8ed0: 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65  CK).    /* These
8ee0: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
8ef0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
8f00: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
8f10: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
8f20: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
8f30: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
8f40: 43 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64  CHECK is defined
8f50: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
8f60: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
8f70: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
8f80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8f90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8fa0: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  PT;.    }.#endif
8fb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
8fc0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
8fd0: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
8fe0: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
8ff0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
9000: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
9010: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20  rk -= size;.#if 
9020: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9030: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
9040: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69  ELL_CHECK).    i
9050: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
9060: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9070: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9080: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9090: 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b  lse.    if( cbrk
90a0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
90b0: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
90c0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
90d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
90e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
90f0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
9100: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
9110: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
9120: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
9130: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
9140: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
9150: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9160: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
9170: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d  eSize );.    mem
9180: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
9190: 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65   &temp[pc], size
91a0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
91b0: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
91c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
91d0: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
91e0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
91f0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
9200: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
9210: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
9220: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
9230: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
9240: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
9250: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
9260: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
9270: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9280: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9290: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
92a0: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
92b0: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
92c0: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
92d0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
92e0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
92f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9300: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
9310: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
9320: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
9330: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
9340: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
9350: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9360: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
9370: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
9380: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
9390: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
93a0: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
93b0: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
93c0: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
93d0: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
93e0: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
93f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
9400: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
9410: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
9420: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
9430: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
9440: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
9450: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
9460: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
9470: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
9480: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
9490: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
94a0: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
94b0: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
94c0: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
94d0: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
94e0: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
94f0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
9500: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
9510: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
9520: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
9530: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
9540: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
9550: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
9560: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
9570: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
9580: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
9590: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
95a0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
95b0: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
95c0: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
95d0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
95e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
95f0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
9600: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
9610: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
9620: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
9630: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
9640: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
9650: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
9660: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b   */.  int nFrag;
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9690: 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74  mber of fragment
96a0: 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67  ed bytes on pPag
96b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  e */.  int top; 
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
96e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
96f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
9700: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
9710: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
9720: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
9730: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
9740: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
9750: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
9760: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
9770: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
9780: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
9790: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
97a0: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
97b0: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
97c0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
97d0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
97e0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
97f0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
9800: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9810: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9820: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9830: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
9840: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
9850: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
9860: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
9870: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
9880: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
9890: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
98a0: 77 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65  w==0 );.  usable
98b0: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
98c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
98d0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
98e0: 20 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b   usableSize-8 );
98f0: 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61  ..  nFrag = data
9900: 5b 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72  [hdr+7];.  asser
9910: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
9920: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
9930: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
9940: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
9950: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
9960: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
9970: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9980: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
9990: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70  r+5]);.  if( gap
99a0: 3e 74 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51  >top ) return SQ
99b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
99c0: 54 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  T;.  testcase( g
99d0: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
99e0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
99f0: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9a00: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a  e( gap==top );..
9a10: 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20    if( nFrag>=60 
9a20: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  ){.    /* Always
9a30: 20 64 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68   defragment high
9a40: 6c 79 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61  ly fragmented pa
9a50: 67 65 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ges */.    rc = 
9a60: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
9a70: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
9a80: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9a90: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
9aa0: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
9ab0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
9ac0: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
9ad0: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
9ae0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
9af0: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
9b00: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9b10: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9b20: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9b30: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9b40: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9b50: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
9b60: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
9b70: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
9b80: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
9b90: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
9ba0: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
9bb0: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
9bc0: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
9bd0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
9be0: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
9bf0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
9c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9c10: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
9c20: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69   slot */.      i
9c30: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
9c40: 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20  -4 || pc<addr+4 
9c50: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9c60: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9c70: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
9c80: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
9c90: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9ca0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
9cb0: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
9cc0: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
9cd0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
9ce0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
9cf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
9d00: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
9d10: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
9d20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9d30: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9d40: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9d50: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9d60: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9d70: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9d80: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9d90: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9da0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9db0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
9dc0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
9dd0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
9de0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
9df0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9e00: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
9e10: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
9e20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9e30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9e40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9e50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9e60: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
9e70: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9e80: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9e90: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9ea0: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9eb0: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9ec0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9ed0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9ee0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9ef0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9f00: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9f10: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
9f20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9f30: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9f40: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
9f50: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
9f60: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
9f70: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
9f80: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
9f90: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
9fa0: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9fb0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9fc0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9fd0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9fe0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9ff0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
a000: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
a010: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
a020: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a030: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
a040: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
a050: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
a060: 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20   gap+nByte<=top 
a070: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
a080: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
a090: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
a0a0: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
a0b0: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
a0c0: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
a0d0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
a0e0: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
a0f0: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
a100: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
a110: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
a120: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
a130: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
a140: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
a150: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
a160: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
a170: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
a180: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
a190: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
a1a0: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
a1b0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
a1c0: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
a1d0: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
a1e0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
a1f0: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
a200: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
a210: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
a220: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
a230: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
a240: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a250: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
a260: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
a270: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
a280: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
a290: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
a2a0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
a2b0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
a2c0: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
a2d0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
a2e0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
a2f0: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
a300: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
a310: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
a320: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
a330: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
a340: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
a350: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
a360: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
a370: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
a380: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
a390: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
a3a0: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
a3b0: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
a3c0: 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  hdr;.  int iLast
a3d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67           /* Larg
a3f0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65  est possible fre
a400: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
a410: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a420: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
a430: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
a440: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
a450: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a460: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
a470: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
a480: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
a490: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
a4a0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
a4b0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
a4c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
a4d0: 61 72 74 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28  art + size) <= (
a4e0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
a4f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
a500: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a510: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
a520: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
a530: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e  .  assert( size>
a540: 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =0 );   /* Minim
a550: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
a560: 34 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  4 */..  if( pPag
a570: 65 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65  e->pBt->secureDe
a580: 6c 65 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  lete ){.    /* O
a590: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
a5a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
a5b0: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
a5c0: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
a5d0: 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20     ** option is 
a5e0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  enabled */.    m
a5f0: 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72  emset(&data[star
a600: 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20  t], 0, size);.  
a610: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
a620: 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20  space back into 
a630: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
a640: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  of freeblocks.  
a650: 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 65  Note that.  ** e
a660: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
a670: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
a680: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
a690: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20  eeInitPage(),.  
a6a0: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
a6b0: 28 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63  () did not detec
a6c0: 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63 65  t overlapping ce
a6d0: 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65  lls or.  ** free
a6e0: 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65 72  blocks that over
a6f0: 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20 20  lapped cells.   
a700: 4e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74 65  Nor does it dete
a710: 63 74 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ct when the.  **
a720: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
a730: 65 61 20 65 78 63 65 65 64 73 20 74 68 65 20 76  ea exceeds the v
a740: 61 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67 65  alue in the page
a750: 20 68 65 61 64 65 72 2e 20 20 49 66 20 74 68 65   header.  If the
a760: 73 65 0a 20 20 2a 2a 20 73 69 74 75 61 74 69 6f  se.  ** situatio
a770: 6e 73 20 61 72 69 73 65 2c 20 74 68 65 6e 20 73  ns arise, then s
a780: 75 62 73 65 71 75 65 6e 74 20 69 6e 73 65 72 74  ubsequent insert
a790: 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 67 68   operations migh
a7a0: 74 20 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74  t corrupt.  ** t
a7b0: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 53 6f  he freelist.  So
a7c0: 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20 63   we do need to c
a7d0: 68 65 63 6b 20 66 6f 72 20 63 6f 72 72 75 70 74  heck for corrupt
a7e0: 69 6f 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e 69  ion while scanni
a7f0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  ng.  ** the free
a800: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  list..  */.  hdr
a810: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
a820: 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64  set;.  addr = hd
a830: 72 20 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d  r + 1;.  iLast =
a840: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
a850: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61  bleSize - 4;.  a
a860: 73 73 65 72 74 28 20 73 74 61 72 74 3c 3d 69 4c  ssert( start<=iL
a870: 61 73 74 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ast );.  while( 
a880: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
a890: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
a8a0: 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e  <start && pbegin
a8b0: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 62  >0 ){.    if( pb
a8c0: 65 67 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20  egin<addr+4 ){. 
a8d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a8e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a8f0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20  .    }.    addr 
a900: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20  = pbegin;.  }.  
a910: 69 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73 74  if( pbegin>iLast
a920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a930: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a940: 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
a950: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c  ( pbegin>addr ||
a960: 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20   pbegin==0 );.  
a970: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  put2byte(&data[a
a980: 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20  ddr], start);.  
a990: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
a9a0: 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a  tart], pbegin);.
a9b0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a9c0: 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29  [start+2], size)
a9d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
a9e0: 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20   = pPage->nFree 
a9f0: 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20  + (u16)size;..  
aa00: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
aa10: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
aa20: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 68 64 72   */.  addr = hdr
aa30: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
aa40: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
aa50: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
aa60: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
aa70: 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20  xt, psize, x;.  
aa80: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
aa90: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73  >addr );.    ass
aaa0: 65 72 74 28 20 70 62 65 67 69 6e 20 3c 3d 20 28  ert( pbegin <= (
aab0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
aac0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
aad0: 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32      pnext = get2
aae0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
aaf0: 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d  n]);.    psize =
ab00: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ab10: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
ab20: 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69  if( pbegin + psi
ab30: 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20  ze + 3 >= pnext 
ab40: 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20  && pnext>0 ){.  
ab50: 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70      int frag = p
ab60: 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70  next - (pbegin+p
ab70: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  size);.      if(
ab80: 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72   (frag<0) || (fr
ab90: 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72  ag>(int)data[hdr
aba0: 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  +7]) ){.        
abb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
abc0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
abd0: 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68    }.      data[h
abe0: 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61  dr+7] -= (u8)fra
abf0: 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  g;.      x = get
ac00: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
ac10: 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62  t]);.      put2b
ac20: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
ac30: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d  ], x);.      x =
ac40: 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74   pnext + get2byt
ac50: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d  e(&data[pnext+2]
ac60: 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  ) - pbegin;.    
ac70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ac80: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a  [pbegin+2], x);.
ac90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aca0: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
acb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
acc0: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
acd0: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
ace0: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
acf0: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
ad00: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
ad10: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
ad20: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
ad30: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
ad40: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
ad50: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
ad60: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
ad70: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
ad80: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
ad90: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
ada0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
adb0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67  data[hdr+5]) + g
adc0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
add0: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75  egin+2]);.    pu
ade0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
adf0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20  +5], top);.  }. 
ae00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ae10: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
ae20: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ae30: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
ae40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ae50: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
ae60: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
ae70: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
ae80: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
ae90: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
aea0: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
aeb0: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
aec0: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
aed0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
aee0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
aef0: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
af00: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
af10: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
af20: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
af30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
af40: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
af50: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
af60: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
af70: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
af80: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
af90: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
afa0: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
afb0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
afc0: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
afd0: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
afe0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
aff0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
b000: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
b010: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
b020: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
b030: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
b040: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
b050: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
b060: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
b070: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
b080: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b090: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
b0a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
b0b0: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
b0c0: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
b0d0: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
b0e0: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
b0f0: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
b100: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
b110: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
b120: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42  Page->leaf;.  pB
b130: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
b140: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
b150: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
b160: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
b170: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
b180: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
b190: 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65  >hasData = pPage
b1a0: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  ->leaf;.    pPag
b1b0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
b1c0: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
b1d0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
b1e0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
b1f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
b200: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
b210: 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  TA ){.    pPage-
b220: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
b230: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
b240: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
b250: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
b260: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
b270: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
b280: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
b290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
b2a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b2b0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
b2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b2d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
b2e0: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
b2f0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
b300: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
b310: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
b320: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
b330: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
b340: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
b350: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
b360: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
b370: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
b380: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
b390: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
b3a0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
b3b0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
b3c0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
b3d0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
b3e0: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
b3f0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
b400: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
b410: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
b420: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
b430: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
b440: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
b450: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
b460: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
b470: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b480: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b490: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b4a0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
b4b0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
b4c0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
b4d0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
b4e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
b4f0: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
b500: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
b510: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
b520: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b530: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
b540: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
b550: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
b560: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
b570: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
b580: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
b590: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b5a0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
b5b0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
b5c0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
b5d0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
b5e0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
b5f0: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
b600: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
b610: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
b620: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
b630: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
b640: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
b650: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
b660: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
b670: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
b680: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
b690: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
b6a0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
b6b0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
b6c0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
b6d0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
b6e0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
b6f0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
b700: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
b710: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
b720: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
b730: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
b740: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
b750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b760: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
b770: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b780: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
b790: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
b7a0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
b7b0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
b7c0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
b7d0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
b7e0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
b7f0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b800: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
b810: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
b820: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
b830: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b840: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
b850: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  ge->aData;.    i
b860: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
b870: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
b880: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
b890: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b8a0: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
b8b0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
b8c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
b8d0: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61  65536 );.    pPa
b8e0: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
b8f0: 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
b900: 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61  ze - 1);.    pPa
b910: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
b920: 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  0;.    usableSiz
b930: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
b940: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
b950: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
b960: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
b970: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
b980: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  af;.    pPage->a
b990: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
b9a0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
b9b0: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
b9c0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b9d0: 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20  set];.    top = 
b9e0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
b9f0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
ba00: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
ba10: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ba20: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
ba30: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
ba40: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
ba50: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
ba60: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
ba70: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
ba80: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
ba90: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
baa0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bab0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
bac0: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
bad0: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
bae0: 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f  L(pBt) );..    /
baf0: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
bb00: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
bb10: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
bb20: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
bb30: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
bb40: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
bb50: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
bb60: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
bb70: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
bb80: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
bb90: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
bba0: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
bbb0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
bbc0: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
bbd0: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
bbe0: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
bbf0: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
bc00: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
bc10: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
bc20: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
bc30: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
bc40: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
bc50: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
bc60: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
bc70: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
bc80: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
bc90: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
bcb0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
bcc0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
bcd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
bce0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
bcf0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
bd00: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
bd10: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
bd20: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
bd30: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
bd40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
bd50: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
bd60: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
bd70: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
bd80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
bd90: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
bda0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
bdb0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
bdc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
bdd0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
bde0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bdf0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
be00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
be10: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
be20: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
be30: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
be40: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
be50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
be60: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
be70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
be80: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
be90: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
bea0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
beb0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
bec0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
bed0: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
bee0: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
bef0: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
bf00: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
bf10: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
bf20: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
bf30: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
bf40: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
bf50: 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
bf60: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
bf70: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  p;.    while( pc
bf80: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
bf90: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
bfa0: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
bfb0: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
bfc0: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
bfd0: 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20  * Start of free 
bfe0: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
bff0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
c000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c010: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c020: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
c030: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c040: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
c050: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
c060: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c070: 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26    if( (next>0 &&
c080: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
c090: 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  ) || pc+size>usa
c0a0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
c0b0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
c0c0: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
c0d0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e  ending order. An
c0e0: 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  d the last byte 
c0f0: 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65 65 2d  of..** the free-
c100: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
c110: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
c120: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
c130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c140: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c150: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
c160: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
c170: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
c180: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
c190: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
c1a0: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
c1b0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
c1c0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
c1d0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
c1e0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c1f0: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
c200: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
c210: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
c220: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c230: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
c240: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
c250: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
c260: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
c270: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
c280: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
c290: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
c2a0: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
c2b0: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
c2c0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c2d0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
c2e0: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
c2f0: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
c300: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
c310: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
c320: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
c330: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
c340: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c350: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c360: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c370: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
c380: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c390: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
c3a0: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
c3b0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
c3c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c3d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c3e0: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
c3f0: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
c400: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
c410: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
c420: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
c430: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
c440: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
c450: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
c460: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c470: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
c480: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
c490: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
c4a0: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
c4b0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c4c0: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
c4d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c4e0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
c4f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c500: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
c510: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c520: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c530: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c540: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
c550: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c560: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
c570: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c580: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
c590: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c5a0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c5b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c5c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c5d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
c5e0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
c5f0: 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65  f( pBt->secureDe
c600: 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65 6d 73  lete ){.    mems
c610: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
c620: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
c630: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
c640: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
c650: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
c660: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
c670: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
c680: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
c690: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
c6a0: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
c6b0: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
c6c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c6d0: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
c6e0: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
c6f0: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
c700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c710: 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
c720: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
c730: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
c740: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
c750: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
c760: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
c770: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
c780: 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
c790: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
c7a0: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
c7b0: 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
c7c0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
c7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
c7e0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
c7f0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
c800: 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
c810: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
c820: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
c830: 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
c840: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
c850: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
c860: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
c870: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
c880: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
c890: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
c8a0: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
c8b0: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
c8c0: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
c8d0: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
c8e0: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
c8f0: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
c900: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
c910: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
c920: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
c930: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
c940: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
c950: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
c960: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c970: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
c980: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
c990: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
c9a0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
c9b0: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
c9c0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
c9d0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
c9e0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
c9f0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
ca00: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
ca10: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
ca20: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
ca30: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
ca40: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
ca50: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
ca60: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
ca70: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
ca80: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
ca90: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
caa0: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
cab0: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
cac0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
cad0: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
cae0: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
caf0: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
cb00: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
cb10: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
cb20: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
cb30: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
cb40: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
cb50: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
cb60: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
cb70: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
cb80: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
cb90: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
cba0: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
cbb0: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
cbc0: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
cbd0: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
cbe0: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
cbf0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
cc00: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
cc10: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
cc20: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
cc30: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
cc40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
cc50: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
cc60: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
cc70: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
cc80: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
cc90: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
cca0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
ccb0: 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  nt        /* Do 
ccc0: 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f  not load page co
ccd0: 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f  ntent if true */
cce0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
ccf0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
cd00: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
cd10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
cd20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cd30: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
cd40: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
cd50: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
cd60: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
cd70: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
cd80: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
cd90: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
cda0: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
cdb0: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
cdc0: 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
cdd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cde0: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
cdf0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
ce00: 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
ce10: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
ce20: 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
ce30: 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
ce40: 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
ce50: 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
ce60: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
ce70: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
ce80: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
ce90: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
cea0: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
ceb0: 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
cec0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
ced0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
cee0: 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
cef0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
cf00: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
cf10: 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
cf20: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
cf30: 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
cf40: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
cf50: 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
cf60: 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
cf70: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cf80: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
cf90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
cfa0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
cfb0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
cfc0: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
cfd0: 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
cfe0: 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
cff0: 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
d000: 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
d010: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
d020: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
d030: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
d040: 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
d050: 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
d060: 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
d070: 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
d080: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
d090: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
d0a0: 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
d0b0: 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
d0c0: 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
d0d0: 74 75 72 6e 20 28 69 6e 74 29 62 74 72 65 65 50  turn (int)btreeP
d0e0: 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29  agecount(p->pBt)
d0f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
d100: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
d110: 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c  ager and initial
d120: 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f  ize it.  This ro
d130: 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a  utine is just a.
d140: 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77  ** convenience w
d150: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65  rapper around se
d160: 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20  parate calls to 
d170: 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61  btreeGetPage() a
d180: 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74  nd .** btreeInit
d190: 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
d1a0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
d1b0: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
d1c0: 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
d1d0: 74 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  to is undefined.
d1e0: 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69   It.** may remai
d1f0: 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20  n unchanged, or 
d200: 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  it may be set to
d210: 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75   an invalid valu
d220: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d230: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
d240: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
d250: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
d260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d270: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d290: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d2a0: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
d2b0: 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20  age **ppPage    
d2c0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
d2d0: 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
d2e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
d2f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d300: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d310: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
d320: 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67  f( pgno>btreePag
d330: 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
d340: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
d350: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
d360: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62  else{.    rc = b
d370: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
d380: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
d390: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
d3a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d3b0: 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
d3c0: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
d3d0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d3e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d3f0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
d400: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
d410: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73      }.  }..  tes
d420: 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
d430: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
d440: 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
d450: 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
d460: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d470: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
d480: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
d490: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
d4a0: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
d4b0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
d4c0: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
d4d0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
d4e0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d4f0: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
d500: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
d510: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
d520: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
d530: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
d540: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d550: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
d560: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
d570: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
d580: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d590: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
d5a0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
d5b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d5c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d5d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d5e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d5f0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
d600: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
d610: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
d620: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
d630: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
d640: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
d650: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
d660: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
d670: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
d680: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
d690: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
d6a0: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
d6b0: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
d6c0: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
d6d0: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
d6e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d6f0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
d700: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
d710: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
d720: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
d730: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d740: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
d750: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
d760: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
d770: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
d780: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
d790: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
d7a0: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
d7b0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
d7c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d7d0: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
d7e0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d7f0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d800: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
d810: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
d820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d830: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d840: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d850: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
d860: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
d870: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
d880: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d890: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
d8a0: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
d8b0: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
d8c0: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
d8d0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
d8e0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
d8f0: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
d900: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
d910: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
d920: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
d930: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
d940: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
d950: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
d960: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
d970: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
d980: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
d990: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
d9a0: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
d9b0: 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
d9c0: 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
d9d0: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
d9e0: 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
d9f0: 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
da00: 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
da10: 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
da20: 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
da30: 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
da40: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
da50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
da60: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
da70: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
da80: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
da90: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
daa0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
dab0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
dac0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
dad0: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
dae0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
daf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
db00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
db10: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
db20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
db30: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
db40: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
db50: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
db60: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
db70: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
db80: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
db90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
dba0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
dbb0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
dbc0: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
dbd0: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
dbe0: 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
dbf0: 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
dc00: 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
dc10: 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
dc20: 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
dc30: 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
dc40: 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
dc50: 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
dc60: 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
dc70: 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
dc80: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
dc90: 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
dca0: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
dcb0: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
dcc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
dcd0: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
dce0: 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
dcf0: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
dd00: 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
dd10: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
dd20: 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
dd30: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
dd40: 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
dd50: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
dd60: 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
dd70: 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 0a 2a  t contain bits.*
dd80: 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
dd90: 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
dda0: 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 2e 20 20  E_NO_READLOCK.  
ddb0: 54 68 65 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41  The BTREE_NO_REA
ddc0: 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74 20 69 73 20  DLOCK.** bit is 
ddd0: 61 6c 73 6f 20 73 65 74 20 69 66 20 74 68 65 20  also set if the 
dde0: 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63  SQLITE_NoReadloc
ddf0: 6b 20 66 6c 61 67 73 20 69 73 20 73 65 74 20 69  k flags is set i
de00: 6e 20 64 62 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20  n db->flags..** 
de10: 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20  These flags are 
de20: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 69  passed through i
de30: 6e 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  nto sqlite3Pager
de40: 4f 70 65 6e 28 29 20 61 6e 64 20 6d 75 73 74 0a  Open() and must.
de50: 2a 2a 20 62 65 20 74 68 65 20 73 61 6d 65 20 76  ** be the same v
de60: 61 6c 75 65 73 20 61 73 20 50 41 47 45 52 5f 4f  alues as PAGER_O
de70: 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
de80: 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
de90: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
dea0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
deb0: 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
dec0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
ded0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
dee0: 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
def0: 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
df00: 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
df10: 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
df20: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
df30: 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
df40: 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
df50: 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
df60: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
df70: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
df80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
df90: 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
dfa0: 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
dfb0: 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
dfc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dfd0: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c  BtreeOpen(.  sql
dfe0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
dff0: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
e000: 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72  se for this b-tr
e010: 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ee */.  const ch
e020: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
e030: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
e040: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
e050: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
e060: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
e070: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
e080: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
e090: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
e0a0: 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
e0b0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
e0c0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
e0d0: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
e0e0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
e0f0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
e100: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
e110: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
e120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
e130: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
e140: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
e150: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
e160: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e170: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e180: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
e190: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
e1a0: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
e1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1c0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
e1d0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
e1e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e1f0: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
e200: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
e210: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
e220: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
e230: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e240: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
e250: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
e260: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
e270: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
e280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e290: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
e2a0: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
e2b0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
e2c0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
e2d0: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
e2e0: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
e2f0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
e300: 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67   True if opening
e310: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   an ephemeral, t
e320: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
e330: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
e340: 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c   isTempDb = zFil
e350: 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
e360: 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20  ename[0]==0;..  
e370: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
e380: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
e390: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
e3a0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
e3b0: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
e3c0: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
e3d0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69  atabase..  */.#i
e3e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
e3f0: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73  _MEMORYDB.  cons
e400: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
e410: 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  0;.#else.  const
e420: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28   int isMemdb = (
e430: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72  zFilename && str
e440: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
e450: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20  :memory:")==0). 
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70        || (isTemp
e480: 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d  Db && sqlite3Tem
e490: 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 3b 0a  pInMemory(db));.
e4a0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
e4b0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
e4c0: 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
e4d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e4e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
e4f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
e500: 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
e510: 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
e520: 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
e530: 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
e540: 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
e550: 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
e560: 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
e570: 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
e580: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
e590: 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
e5a0: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
e5b0: 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
e5c0: 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
e5d0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
e5e0: 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
e5f0: 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
e600: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
e610: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
e620: 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
e630: 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 64 62  pDb );..  if( db
e640: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e650: 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  _NoReadlock ){. 
e660: 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
e670: 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  E_NO_READLOCK;. 
e680: 20 7d 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62   }.  if( isMemdb
e690: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
e6a0: 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
e6b0: 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
e6c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e6d0: 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
e6e0: 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
e6f0: 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
e700: 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
e710: 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
e720: 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
e730: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
e740: 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
e750: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
e760: 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
e770: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
e780: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e790: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
e7a0: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
e7b0: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
e7c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e7d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
e7e0: 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
e7f0: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
e800: 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
e810: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
e820: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
e830: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
e840: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e850: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
e860: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
e870: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
e880: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
e890: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
e8a0: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
e8b0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
e8c0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
e8d0: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
e8e0: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26  f( isMemdb==0 &&
e8f0: 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 29 7b 0a   isTempDb==0 ){.
e900: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
e910: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
e920: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
e930: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
e940: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
e950: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
e960: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
e970: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
e980: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
e990: 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
e9a0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
e9b0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
e9c0: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
e9d0: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
e9e0: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
e9f0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
ea00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ea10: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ea20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ea30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
ea40: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
ea50: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
ea60: 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50  Filename, nFullP
ea70: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
ea80: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  thname);.      i
ea90: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
eaa0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
eab0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
eac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ead0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
eae0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
eaf0: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
eb00: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
eb10: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
eb20: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
eb30: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
eb40: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
eb50: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
eb60: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
eb70: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
eb80: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
eb90: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
eba0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
ebb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ebc0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
ebd0: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
ebe0: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
ebf0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
ec00: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
ec10: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
ec20: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
ec30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
ec40: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
ec50: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
ec60: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
ec70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
ec80: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
ec90: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
eca0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
ecb0: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
ecc0: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
ecd0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
ece0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
ecf0: 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
ed00: 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
ed10: 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
ed20: 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
ed30: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
ed40: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
ed50: 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
ed60: 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
ed70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ed80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ed90: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
eda0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
edb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
edc0: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
edd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
ede0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
edf0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ee00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ee10: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
ee20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ee30: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ee40: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
ee50: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ee60: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
ee70: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
ee80: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
ee90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
eeb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
eec0: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
eed0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
eee0: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
eef0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
ef00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ef10: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
ef20: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
ef30: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
ef40: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
ef50: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
ef60: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
ef70: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
ef80: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
ef90: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
efa0: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
efb0: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
efc0: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
efd0: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
efe0: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
eff0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
f000: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
f010: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
f020: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
f030: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
f040: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
f050: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
f060: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
f070: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
f080: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
f090: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
f0a0: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
f0b0: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
f0c0: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
f0d0: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
f0e0: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
f0f0: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
f100: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
f110: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
f120: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
f130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f140: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
f150: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
f160: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
f170: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
f180: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
f190: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
f1a0: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
f1b0: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
f1c0: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
f1d0: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
f1e0: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
f1f0: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
f200: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
f210: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
f220: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
f230: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
f240: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f250: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f260: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
f270: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f280: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
f290: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
f2a0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
f2d0: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20  lags, vfsFlags, 
f2e0: 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
f2f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f300: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
f310: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
f320: 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
f330: 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
f340: 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
f350: 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
f360: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f370: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
f380: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
f390: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
f3a0: 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
f3b0: 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
f3c0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
f3d0: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
f3e0: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
f3f0: 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
f400: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
f410: 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
f420: 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
f430: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
f440: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
f450: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
f460: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
f470: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
f480: 2d 3e 70 50 61 67 65 72 29 3b 0a 23 69 66 64 65  ->pPager);.#ifde
f490: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
f4a0: 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
f4b0: 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d 20 31  secureDelete = 1
f4c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74  ;.#endif.    pBt
f4d0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
f4e0: 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
f4f0: 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
f500: 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
f510: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
f520: 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
f530: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
f540: 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
f550: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
f560: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
f570: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
f580: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
f590: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
f5a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f5b0: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
f5c0: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
f5d0: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
f5e0: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
f5f0: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
f600: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
f610: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
f620: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
f630: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
f640: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
f650: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
f660: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
f670: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
f680: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
f690: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
f6a0: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
f6b0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
f6c0: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
f6d0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
f6e0: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
f6f0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
f700: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
f710: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
f720: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
f730: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
f740: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
f750: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
f760: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
f770: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
f780: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
f790: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
f7a0: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
f7b0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
f7c0: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
f7d0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
f7e0: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
f7f0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
f800: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
f810: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
f820: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f830: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
f840: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f850: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
f860: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f870: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
f880: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
f890: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
f8a0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
f8b0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
f8c0: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
f8d0: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
f8e0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
f8f0: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
f900: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
f910: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
f920: 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
f930: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
f940: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
f950: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
f960: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
f970: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
f980: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
f990: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
f9a0: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
f9b0: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
f9c0: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
f9d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f9e0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
f9f0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
fa00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
fa10: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
fa20: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
fa30: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
fa40: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
fa50: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
fa60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
fa70: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
fa80: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
fa90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
faa0: 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
fab0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
fac0: 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
fad0: 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
fae0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
faf0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
fb00: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
fb10: 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
fb20: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
fb30: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
fb40: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
fb50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
fb60: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
fb70: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fb80: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
fb90: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
fba0: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
fbb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fbc0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
fbd0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
fbe0: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
fbf0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
fc00: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
fc10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
fc20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fc30: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
fc40: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
fc50: 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
fc60: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fc70: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
fc80: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
fc90: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fca0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
fcb0: 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
fcc0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
fcd0: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
fce0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
fcf0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
fd00: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
fd10: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
fd20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
fd30: 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
fd40: 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
fd50: 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
fd60: 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
fd70: 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
fd80: 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
fd90: 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
fda0: 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
fdb0: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
fdc0: 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
fdd0: 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
fde0: 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
fdf0: 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
fe00: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
fe10: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
fe20: 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
fe30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fe40: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
fe50: 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
fe60: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
fe70: 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
fe80: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
fe90: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
fea0: 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
feb0: 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
fec0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
fed0: 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
fee0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
fef0: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
ff00: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
ff10: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
ff20: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
ff30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ff40: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
ff50: 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
ff60: 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
ff70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ff80: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
ff90: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
ffa0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
ffb0: 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
ffc0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
ffd0: 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
ffe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
fff0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
10000 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
10010 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
10020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
10030 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
10040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10060 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
10070 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
10080 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
10090 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
100a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
100b0 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
100c0 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
100d0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
100e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
100f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
10100 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
10110 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
10120 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
10130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10140 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
10150 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
10160 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
10170 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
10180 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
10190 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
101a0 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
101b0 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
101c0 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
101d0 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
101e0 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
101f0 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
10200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10210 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
10220 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
10230 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10240 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
10250 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
10260 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
10270 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
10280 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
10290 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
102a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
102b0 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
102c0 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
102d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
102e0 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
102f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10300 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
10310 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
10320 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
10330 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
10340 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
10350 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
10360 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
10370 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
10380 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
10390 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
103a0 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
103b0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
103c0 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
103d0 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
103e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
103f0 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
10400 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
10410 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
10420 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10430 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
10440 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
10450 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
10460 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
10470 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
10480 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
10490 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
104a0 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
104b0 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
104c0 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
104d0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
104e0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
104f0 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
10500 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10510 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
10520 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
10530 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
10540 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
10550 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10560 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
10570 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
10580 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
10590 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
105a0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
105b0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
105c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
105d0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
105e0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
105f0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
10600 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
10610 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
10620 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
10630 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
10640 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
10650 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
10660 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
10670 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
10680 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
10690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
106a0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
106b0 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
106c0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
106d0 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
106e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
106f0 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
10700 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10710 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
10720 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
10730 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
10740 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10750 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
10760 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
10770 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
10780 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
10790 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
107a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
107b0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
107c0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
107d0 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
107e0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
107f0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
10800 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
10810 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
10820 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
10830 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
10840 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
10850 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
10860 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
10870 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10880 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
10890 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
108a0 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
108b0 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
108c0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
108d0 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
108e0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
108f0 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
10900 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
10910 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
10920 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10930 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
10940 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
10950 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10960 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
10970 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
10980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10990 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
109a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
109b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
109c0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
109d0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
109e0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
109f0 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
10a00 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
10a10 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
10a20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
10a30 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
10a40 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10a50 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
10a60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
10a70 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
10a80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
10a90 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
10aa0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
10ab0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
10ac0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10ad0 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
10ae0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
10af0 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
10b00 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
10b10 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10b20 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
10b30 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
10b40 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10b50 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
10b60 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
10b70 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
10b80 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
10b90 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
10ba0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
10bb0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
10bc0 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
10bd0 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
10be0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
10bf0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
10c00 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
10c10 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
10c20 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
10c30 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
10c40 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
10c50 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
10c60 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
10c70 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
10c80 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
10c90 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
10ca0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
10cb0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
10cc0 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
10cd0 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
10ce0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10cf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10d00 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
10d10 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
10d20 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10d30 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
10d40 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
10d50 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
10d60 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
10d70 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
10d80 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
10d90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
10da0 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
10db0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
10dc0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
10dd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10de0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
10df0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10e00 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
10e10 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
10e20 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
10e30 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
10e40 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
10e50 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
10e60 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
10e70 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
10e80 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
10e90 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
10ea0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
10eb0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
10ec0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10ed0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
10ee0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
10ef0 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
10f00 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
10f10 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
10f20 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
10f30 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
10f40 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
10f50 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
10f60 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
10f70 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
10f80 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
10f90 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
10fa0 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
10fb0 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
10fc0 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
10fd0 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
10fe0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
10ff0 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
11000 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
11010 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
11020 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
11030 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
11040 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
11050 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
11060 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
11070 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
11080 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
11090 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
110a0 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
110b0 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
110c0 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
110d0 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
110e0 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
110f0 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
11100 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
11110 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
11120 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
11130 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
11140 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
11150 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
11160 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
11170 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
11180 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
11190 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
111a0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
111b0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
111c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
111d0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
111e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
111f0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11200 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
11210 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11220 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
11230 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
11240 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
11250 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11260 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11270 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11280 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
11290 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
112a0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
112b0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
112c0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
112d0 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
112e0 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
112f0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
11300 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
11310 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
11320 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
11330 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
11340 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
11350 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
11360 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
11370 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
11380 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
11390 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
113a0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
113b0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
113c0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
113d0 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
113e0 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
113f0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
11400 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
11410 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
11420 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
11430 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
11440 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
11450 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
11460 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11470 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 42  SafetyLevel(.  B
11480 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
11490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
114a0 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
114b0 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
114c0 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20  .  int level,   
114d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
114e0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e  GMA synchronous.
114f0 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41    1=OFF, 2=NORMA
11500 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69  L, 3=FULL */.  i
11510 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20  nt fullSync,    
11520 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
11530 66 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20  fullfsync. */.  
11540 69 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63  int ckptFullSync
11550 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
11560 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
11570 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  fync */.){.  BtS
11580 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11590 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
115a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
115b0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
115c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  );.  assert( lev
115d0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
115e0 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  3 );.  sqlite3Bt
115f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11600 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
11610 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
11620 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
11630 6c 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c  llSync, ckptFull
11640 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
11650 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11670 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
11680 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11690 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
116a0 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
116b0 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
116c0 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
116d0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
116e0 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
116f0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
11700 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11710 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
11720 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
11730 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11740 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
11750 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11760 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11770 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
11780 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
11790 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
117a0 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
117b0 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
117c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
117d0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
117e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
117f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11800 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11810 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
11820 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
11830 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
11840 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
11850 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
11860 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
11870 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
11880 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
11890 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
118a0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
118b0 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
118c0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
118d0 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
118e0 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
118f0 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
11900 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
11910 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
11920 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
11930 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
11940 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
11950 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
11960 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
11970 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
11980 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
11990 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
119a0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
119b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
119c0 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
119d0 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
119e0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
119f0 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
11a00 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
11a10 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
11a20 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
11a30 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
11a40 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
11a50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
11a60 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
11a70 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
11a80 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
11a90 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
11aa0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
11ab0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
11ac0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
11ad0 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
11ae0 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c  pageSizeFixed fl
11af0 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
11b00 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
11b10 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
11b20 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
11b30 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
11b40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11b50 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
11b60 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
11b70 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
11b80 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
11b90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11ba0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
11bb0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11bc0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
11bd0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
11be0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
11bf0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11c00 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
11c10 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
11c20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11c30 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
11c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11c50 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
11c60 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
11c70 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
11c80 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
11c90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
11ca0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
11cb0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
11cc0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
11cd0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
11ce0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
11cf0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
11d00 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
11d10 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
11d20 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
11d30 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
11d40 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
11d50 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
11d60 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
11d70 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
11d80 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
11d90 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
11da0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
11db0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
11dc0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
11dd0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
11de0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
11df0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
11e00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11e10 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
11e20 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
11e30 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
11e40 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
11e50 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  d = 1;.  sqlite3
11e60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11e80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11e90 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
11ea0 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
11eb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
11ec0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
11ed0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
11ee0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
11ef0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
11f00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
11f10 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
11f20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11f30 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
11f40 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
11f50 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
11f60 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
11f70 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
11f80 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
11f90 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
11fa0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
11fb0 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
11fc0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
11fd0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
11fe0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
11ff0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
12000 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
12010 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
12020 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12030 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
12040 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12050 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12060 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12070 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12080 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
12090 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
120a0 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
120b0 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
120c0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
120d0 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
120e0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
120f0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
12100 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
12110 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
12120 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
12130 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
12140 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
12150 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
12160 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
12170 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12180 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
12190 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
121a0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
121b0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
121c0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
121d0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  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 6e 3b 0a 7d 0a 0a 2f    return n;.}../
12200 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
12210 75 72 65 44 65 6c 65 74 65 20 66 6c 61 67 20 69  ureDelete flag i
12220 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f  f newFlag is 0 o
12230 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67  r 1.  If newFlag
12240 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20   is -1,.** then 
12250 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e  make no changes.
12260 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
12270 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12280 20 73 65 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a   secureDelete.**
12290 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
122a0 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
122b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
122c0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
122d0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
122e0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
122f0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
12300 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
12310 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
12320 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
12330 20 20 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72     p->pBt->secur
12340 65 44 65 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c  eDelete = (newFl
12350 61 67 21 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a  ag!=0) ? 1 : 0;.
12360 20 20 7d 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42    } .  b = p->pB
12370 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 3b  t->secureDelete;
12380 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12390 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
123a0 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n b;.}.#endif /*
123b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
123c0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
123d0 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
123e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
123f0 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
12400 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
12410 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12420 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12430 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
12440 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
12450 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
12460 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
12470 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
12480 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
12490 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
124a0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
124b0 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
124c0 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
124d0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
124e0 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
124f0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
12500 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
12510 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
12520 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
12530 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
12540 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12550 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12560 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12570 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
12580 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12590 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
125a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
125b0 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
125c0 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
125d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
125e0 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
125f0 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20  ageSizeFixed && 
12600 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
12610 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
12620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
12630 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
12640 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
12650 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
12660 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
12670 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
12680 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
12690 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
126a0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
126b0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
126c0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
126d0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
126e0 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
126f0 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
12700 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
12710 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
12720 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
12730 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
12740 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
12750 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12760 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12770 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
12780 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
12790 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
127a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
127b0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
127c0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
127d0 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
127e0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
127f0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
12800 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
12810 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
12820 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
12830 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
12840 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12850 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12860 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
12870 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
12880 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
12890 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
128a0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
128b0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
128c0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
128d0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
128e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
128f0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
12900 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
12910 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
12920 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
12930 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
12940 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
12950 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
12960 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
12970 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
12980 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
12990 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
129a0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
129b0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
129c0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
129d0 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
129e0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
129f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12a00 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12a10 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
12a20 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
12a30 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
12a40 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
12a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
12a60 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
12a70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12a80 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
12a90 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
12aa0 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
12ab0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
12ac0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
12ad0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
12ae0 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
12af0 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
12b00 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
12b10 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
12b20 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
12b30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12b40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12b50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12b60 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
12b70 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
12b80 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
12b90 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
12ba0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12bb0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
12bc0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
12bd0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
12be0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
12bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12c00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
12c10 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
12c20 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
12c30 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
12c40 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
12c50 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
12c60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
12c70 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
12c80 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
12c90 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
12ca0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
12cb0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12cc0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
12cd0 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
12ce0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
12cf0 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
12d00 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
12d10 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12d20 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
12d30 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
12d40 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
12d50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
12d60 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
12d70 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
12d80 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
12d90 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
12da0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12db0 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
12dc0 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
12dd0 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
12de0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12df0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12e00 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
12e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
12e20 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
12e30 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
12e40 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
12e50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
12e60 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
12e70 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
12e80 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12e90 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
12ea0 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
12eb0 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12ec0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12ed0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
12ee0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12ef0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12f00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12f10 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
12f20 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
12f30 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
12f40 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
12f50 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
12f60 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
12f70 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
12f80 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
12f90 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
12fa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12fb0 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
12fc0 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
12fd0 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
12fe0 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
12ff0 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
13000 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
13010 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
13020 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
13030 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
13040 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
13050 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
13060 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
13070 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
13080 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
13090 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
130a0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
130b0 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
130c0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
130d0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
130e0 32 20 26 26 20 70 42 74 2d 3e 64 6f 4e 6f 74 55  2 && pBt->doNotU
130f0 73 65 57 41 4c 3d 3d 30 20 29 7b 0a 20 20 20 20  seWAL==0 ){.    
13100 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
13110 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13120 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
13130 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
13140 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
13150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13160 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
13170 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13180 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  d;.      }else i
13190 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
131a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
131b0 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59  FAULT_WAL_SAFETY
131c0 4c 45 56 45 4c 0a 20 20 20 20 20 20 20 20 2f 2a  LEVEL.        /*
131d0 20 44 65 66 61 75 6c 74 20 74 6f 20 73 70 65 63   Default to spec
131e0 69 66 69 65 64 20 73 61 66 65 74 79 5f 6c 65 76  ified safety_lev
131f0 65 6c 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 20  el for WAL mode 
13200 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
13210 42 74 2d 3e 64 62 21 3d 30 20 26 26 20 70 42 74  Bt->db!=0 && pBt
13220 2d 3e 64 62 2d 3e 61 44 62 21 3d 30 20 29 7b 0a  ->db->aDb!=0 ){.
13230 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
13240 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  b;.          sql
13250 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e  ite3 *db = pBt->
13260 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 44 62  db;.          Db
13270 20 2a 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b   *aDb = db->aDb;
13280 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 6c 65  .          u8 le
13290 76 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  vel = 0;.       
132a0 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44     for(iDb=0; iD
132b0 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
132c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
132d0 66 28 20 61 44 62 5b 69 44 62 5d 2e 70 42 74 20  f( aDb[iDb].pBt 
132e0 26 26 20 61 44 62 5b 69 44 62 5d 2e 70 42 74 2d  && aDb[iDb].pBt-
132f0 3e 70 42 74 3d 3d 70 42 74 20 29 20 62 72 65 61  >pBt==pBt ) brea
13300 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
13310 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13320 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
13330 20 20 20 20 20 20 20 20 20 20 6c 65 76 65 6c 20            level 
13340 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  = db->aDb[iDb].s
13350 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20  afety_level;.   
13360 20 20 20 20 20 20 20 69 66 28 20 21 53 51 4c 49         if( !SQLI
13370 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65 6c  TE_DbSafetyLevel
13380 49 73 46 69 78 65 64 28 6c 65 76 65 6c 29 20 26  IsFixed(level) &
13390 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
133a0 28 53 51 4c 49 54 45 5f 44 62 53 61 66 65 74 79  (SQLITE_DbSafety
133b0 4c 65 76 65 6c 56 61 6c 75 65 28 6c 65 76 65 6c  LevelValue(level
133c0 29 20 21 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ) != SQLITE_DEFA
133d0 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45  ULT_WAL_SAFETYLE
133e0 56 45 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  VEL) ){.        
133f0 20 20 20 20 61 44 62 5b 69 44 62 5d 2e 73 61 66      aDb[iDb].saf
13400 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49  ety_level = SQLI
13410 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
13420 41 46 45 54 59 4c 45 56 45 4c 3b 0a 20 20 20 20  AFETYLEVEL;.    
13430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
13440 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
13450 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
13460 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
13470 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 2c 20  AL_SAFETYLEVEL, 
13480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61          (db->fla
134b0 67 73 26 53 51 4c 49 54 45 5f 46 75 6c 6c 46 53  gs&SQLITE_FullFS
134c0 79 6e 63 29 21 3d 30 2c 0a 20 20 20 20 20 20 20  ync)!=0,.       
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
13500 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 29  E_CkptFullFSync)
13510 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
13520 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
13530 69 66 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  if.        relea
13540 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13550 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13570 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
13580 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
13590 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
135a0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
135b0 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
135c0 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
135d0 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
135e0 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
135f0 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
13600 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
13610 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
13620 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
13630 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
13640 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
13650 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
13660 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
13670 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
13680 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
13690 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
136a0 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
136b0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
136c0 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
136d0 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
136e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
136f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13700 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
13710 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
13720 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
13730 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
13740 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
13750 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
13760 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
13770 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
13780 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
13790 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
137a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
137b0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
137c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
137d0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
137e0 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
137f0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
13800 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
13810 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
13820 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
13830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
13840 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
13850 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
13860 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
13870 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
13880 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
13890 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
138a0 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
138b0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
138c0 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
138d0 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
138e0 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
138f0 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
13900 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
13910 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
13920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
13930 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
13940 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
13950 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
13960 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
13970 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
13980 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
13990 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
139a0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
139b0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
139c0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
139d0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
139e0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
139f0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
13a00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13a10 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13a20 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13a30 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
13a70 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
13a80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13a90 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
13aa0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
13ab0 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
13ac0 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
13ad0 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
13ae0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
13af0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
13b00 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
13b10 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
13b20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
13b30 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
13b40 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13b50 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
13b60 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
13b70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
13b80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
13b90 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
13ba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13bb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
13bc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
13bd0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
13be0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
13bf0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
13c00 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
13c10 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
13c20 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
13c30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
13c40 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
13c50 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
13c60 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
13c70 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
13c80 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
13c90 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
13ca0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
13cb0 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
13cc0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
13cd0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
13ce0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
13cf0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
13d00 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
13d10 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
13d20 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
13d30 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
13d40 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
13d50 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
13d60 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
13d70 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
13d80 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
13d90 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
13da0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
13db0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
13dc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
13dd0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
13de0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
13df0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
13e00 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
13e10 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
13e20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
13e30 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
13e40 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
13e50 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
13e60 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
13e70 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
13e80 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
13e90 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
13ea0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13eb0 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
13ec0 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
13ed0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
13ee0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
13ef0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
13f00 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
13f10 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
13f20 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
13f30 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
13f40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
13f50 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
13f60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13f70 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
13f80 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
13f90 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
13fa0 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
13fb0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
13fc0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
13fd0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
13fe0 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
13ff0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
14000 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
14010 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
14020 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
14030 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
14040 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
14050 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
14060 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
14070 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
14080 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
14090 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
140a0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
140b0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
140c0 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
140d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
140e0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
140f0 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
14100 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
14110 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
14120 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
14130 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
14140 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
14150 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
14160 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
14170 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
14180 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
14190 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
141a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
141b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
141c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
141d0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c  Bt->pCursor==0 |
141e0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
141f0 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
14200 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
14210 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14220 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
14230 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
14240 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
14250 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
14260 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14270 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
14280 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
14290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
142a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
142b0 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
142c0 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
142d0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
142e0 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
142f0 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
14300 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
14310 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
14320 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
14330 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
14340 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
14350 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
14360 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
14370 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
14380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
14390 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
143a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
143b0 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
143c0 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
143d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
143e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
143f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
14400 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
14410 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
14420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14430 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
14440 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
14450 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
14460 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
14470 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
14480 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
14490 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
144a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
144b0 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
144c0 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
144d0 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
144e0 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
144f0 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
14500 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
14510 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
14520 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
14530 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
14540 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
14550 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
14560 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
14570 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
14580 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
14590 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
145a0 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
145b0 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
145c0 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
145d0 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
145e0 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
145f0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
14600 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
14610 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
14620 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
14630 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
14640 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
14650 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
14660 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
14670 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
14680 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
14690 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53   );.  pBt->pageS
146a0 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
146b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
146c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
146d0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
146e0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
146f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
14700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
14710 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
14720 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
14730 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
14740 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
14750 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
14760 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
14770 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
14780 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
14790 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
147a0 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
147b0 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
147c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
147d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
147e0 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
147f0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
14800 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
14810 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
14820 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
14830 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
14840 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
14850 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
14860 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
14870 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
14880 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
14890 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
148a0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
148b0 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
148c0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
148d0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
148e0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
148f0 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
14900 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
14910 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
14920 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
14930 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
14940 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
14950 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
14960 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
14970 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
14980 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
14990 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
149a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
149b0 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
149c0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
149d0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
149e0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
149f0 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
14a00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
14a10 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
14a20 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
14a30 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
14a40 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
14a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14a60 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
14a70 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14a80 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
14a90 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
14aa0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
14ab0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14ac0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
14ad0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14ae0 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
14af0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14b00 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
14b10 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14b20 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
14b30 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
14b40 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
14b50 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
14b60 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
14b70 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
14b80 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
14b90 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
14ba0 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
14bb0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
14bc0 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
14bd0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
14be0 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
14bf0 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
14c00 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
14c10 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
14c20 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
14c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14c40 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
14c50 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
14c60 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
14c70 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
14c80 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
14c90 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
14ca0 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
14cb0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
14cc0 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
14cd0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
14ce0 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
14cf0 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
14d00 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
14d10 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
14d20 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
14d30 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
14d40 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
14d50 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
14d60 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
14d70 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
14d80 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
14d90 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
14da0 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
14db0 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
14dc0 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
14dd0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
14de0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
14df0 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
14e00 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
14e10 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
14e20 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
14e30 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
14e40 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
14e50 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
14e60 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
14e70 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
14e80 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
14e90 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
14ea0 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
14eb0 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
14ec0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14ed0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14ee0 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
14ef0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
14f00 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
14f10 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
14f20 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
14f30 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
14f40 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
14f50 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
14f60 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
14f70 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
14f80 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
14f90 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
14fa0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
14fb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
14fc0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
14fd0 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
14fe0 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
14ff0 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
15000 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
15010 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  un;.  }..  /* Wr
15020 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
15030 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
15040 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
15050 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
15060 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
15070 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
15080 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
15090 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
150a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
150b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
150c0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
150d0 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74  CHE.  /* If anot
150e0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
150f0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
15100 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
15110 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
15120 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
15130 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
15140 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
15150 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
15160 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
15170 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
15180 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69  LOCKED..  */.  i
15190 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
151a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
151b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c  ==TRANS_WRITE) |
151c0 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67  | pBt->isPending
151d0 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
151e0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
151f0 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
15200 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
15210 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
15220 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
15230 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
15240 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
15250 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
15260 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
15270 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
15280 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
15290 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
152a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
152b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
152c0 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
152d0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
152e0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
152f0 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
15300 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
15310 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
15320 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
15330 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
15340 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
15350 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
15360 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
15370 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
15380 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
15390 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
153a0 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
153b0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
153c0 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
153d0 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
153e0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
153f0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
15400 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
15410 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
15420 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
15430 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
15440 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
15450 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
15460 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69  gun;..  pBt->ini
15470 74 69 61 6c 6c 79 45 6d 70 74 79 20 3d 20 28 75  tiallyEmpty = (u
15480 38 29 28 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  8)(pBt->nPage==0
15490 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  );.  do {.    /*
154a0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
154b0 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
154c0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
154d0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
154e0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
154f0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
15500 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
15510 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
15520 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
15530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
15540 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
15550 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
15560 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
15570 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
15580 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
15590 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
155a0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
155b0 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
155c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
155d0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
155e0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
155f0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
15600 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
15610 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
15620 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
15630 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
15640 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
15650 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
15660 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
15670 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
15680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15690 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
156a0 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
156b0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
156c0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
156d0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
156e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
156f0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
15700 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
15710 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
15720 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
15730 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15750 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
15760 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
15770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15780 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
15790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
157a0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
157b0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
157c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
157d0 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
157e0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
157f0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15800 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
15810 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
15820 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
15830 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
15840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15850 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
15860 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
15870 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
15880 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
15890 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
158a0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
158b0 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
158c0 61 62 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28  able ){..assert(
158d0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
158e0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
158f0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
15900 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
15910 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
15920 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
15930 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
15940 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
15950 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
15960 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
15970 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
15980 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
15990 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
159a0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
159b0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
159c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
159d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
159e0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
159f0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
15a00 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
15a10 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
15a20 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
15a30 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
15a40 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15a50 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
15a60 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
15a70 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
15a80 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
15a90 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73     pBt->isExclus
15aa0 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61  ive = (u8)(wrfla
15ab0 67 3e 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  g>1);.#endif..  
15ac0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
15ad0 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
15ae0 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
15af0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
15b00 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
15b10 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
15b20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
15b30 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
15b40 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
15b50 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
15b60 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
15b70 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
15b80 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
15b90 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
15ba0 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
15bb0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
15bc0 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
15bd0 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
15be0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
15bf0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
15c00 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
15c10 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
15c20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
15c30 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
15c40 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
15c50 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
15c60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15c70 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
15c80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
15c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15cb0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
15cc0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
15cd0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
15ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15cf0 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
15d00 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
15d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
15d20 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
15d30 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
15d40 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
15d50 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
15d60 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
15d70 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
15d80 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
15d90 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
15da0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
15db0 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
15dc0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
15dd0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
15de0 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
15df0 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
15e00 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
15e10 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
15e20 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
15e30 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
15e40 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
15e50 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
15e60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15e70 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15e80 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
15e90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15ea0 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
15eb0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
15ec0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
15ed0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
15ee0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
15ef0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
15f00 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
15f10 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
15f20 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
15f30 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
15f40 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
15f50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
15f60 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
15f70 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
15f80 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
15f90 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15fc0 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
15fd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16000 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
16010 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
16020 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16050 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
16060 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
16070 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
16080 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
16090 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
160a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
160b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
160c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
160d0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
160e0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
160f0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
16100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16110 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
16120 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
16130 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
16140 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
16150 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
16160 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
16170 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
16180 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
16190 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
161a0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
161b0 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
161c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
161d0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
161e0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
161f0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
16200 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
16210 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
16220 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
16230 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
16240 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
16250 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
16260 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
16270 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
16280 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
16290 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
162a0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
162b0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
162c0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
162d0 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
162e0 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
162f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
16300 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
16310 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16320 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
16330 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
16340 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
16350 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
16360 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
16370 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
16380 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
16390 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
163a0 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
163b0 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
163c0 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
163d0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
163e0 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
163f0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
16400 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
16410 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
16440 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
16450 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
16460 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
16470 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
16480 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
16490 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
164a0 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
164b0 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
164c0 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
164d0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
164e0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
164f0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
16500 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
16510 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
16520 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
16540 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
16550 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
16560 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
16570 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
16580 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
16590 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
165a0 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
165b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
165c0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
165d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
165e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
165f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
16600 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
16610 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
16620 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
16630 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
16640 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
16650 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
16660 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
16670 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
16680 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
16690 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
166a0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
166b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
166c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
166d0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
166e0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
166f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
16700 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
16710 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
16720 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
16730 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65  nCell;..    btre
16740 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
16750 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
16760 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
16770 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
16780 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
16790 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
167a0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
167b0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
167c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
167d0 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
167e0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
167f0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
16800 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
16810 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
16820 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
16830 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26  rflow.         &
16840 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  & pCell+info.iOv
16850 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d  erflow+3<=pPage-
16860 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
16870 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
16880 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
16890 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
168a0 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20  Overflow]).     
168b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
168c0 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
168d0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
168e0 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
168f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16900 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
16910 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
16920 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
16930 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
16940 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
16950 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
16960 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
16970 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16980 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
16990 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
169a0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
169b0 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
169c0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
169d0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
169e0 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
169f0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
16a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
16a10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
16a20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
16a30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
16a40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
16a50 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
16a60 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
16a70 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
16a80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16a90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
16aa0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
16ab0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
16ac0 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
16ad0 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
16ae0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
16af0 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
16b00 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
16b10 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
16b20 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
16b30 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
16b40 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
16b50 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
16b60 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
16b70 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
16b80 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
16b90 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
16ba0 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
16bb0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
16bc0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
16bd0 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
16be0 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
16bf0 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
16c00 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
16c10 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
16c20 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
16c30 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
16c40 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
16c50 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
16c60 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
16c70 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16c90 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
16ca0 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
16cb0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
16cc0 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
16cd0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
16ce0 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
16cf0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
16d00 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
16d10 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
16d20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
16d30 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
16d40 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
16d50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
16d60 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
16d70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
16d80 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
16d90 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
16da0 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
16db0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
16dc0 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
16dd0 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
16de0 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
16df0 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
16e00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
16e10 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
16e20 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16e30 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
16e40 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
16e50 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
16e60 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
16e70 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
16e80 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
16e90 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
16ea0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16eb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
16ec0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
16ed0 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
16ee0 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
16ef0 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
16f00 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
16f10 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
16f20 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
16f30 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
16f40 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
16f50 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
16f60 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
16f70 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
16f80 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
16f90 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
16fa0 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
16fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16fc0 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
16fd0 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
16fe0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
16ff0 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
17000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17010 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17020 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
17030 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
17040 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
17050 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
17060 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
17070 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
17080 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
17090 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
170a0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
170b0 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
170c0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
170d0 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
170e0 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
170f0 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
17100 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
17110 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
17120 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
17130 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
17140 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
17150 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
17160 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
17170 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
17180 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
17190 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
171a0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
171b0 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
171c0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
171d0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
171e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
171f0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
17200 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
17210 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
17220 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
17230 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
17240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17250 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17260 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
17270 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
17280 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
17290 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
172a0 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
172b0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
172c0 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
172d0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
172e0 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
172f0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
17300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17310 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17320 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
17330 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
17340 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
17350 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
17360 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
17370 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
17380 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
17390 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
173a0 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
173b0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
173c0 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
173d0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
173e0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
173f0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
17400 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
17410 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
17420 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
17430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
17450 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
17460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17470 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
17480 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
17490 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
174a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
174b0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
174c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
174d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
174e0 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
174f0 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
17500 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
17510 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
17520 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
17530 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
17540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17550 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
17560 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
17570 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
17580 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
17590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
175a0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
175b0 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
175c0 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
175d0 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
175e0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
175f0 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
17600 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
17610 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
17620 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
17630 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
17640 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
17650 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
17660 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
17670 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
17680 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
17690 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
176a0 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
176b0 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
176c0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
176d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
176e0 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
176f0 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
17700 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
17710 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
17720 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
17730 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
17740 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
17750 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
17760 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
17770 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
17780 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
17790 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
177a0 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
177b0 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
177c0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
177d0 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
177e0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
177f0 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
17800 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
17810 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
17820 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
17830 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
17840 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
17850 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
17860 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
17870 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
17880 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e 46  complete.  If nF
17890 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 69  in is zero, it i
178a0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
178b0 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  * incrVacuumStep
178c0 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  () will be calle
178d0 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e  d a finite amoun
178e0 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68  t of times.** wh
178f0 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
17900 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66 72 65  ot empty the fre
17910 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20 61  elist.  A full a
17920 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73  utovacuum.** has
17930 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52 41   nFin>0.  A "PRA
17940 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
17950 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69 6e  vacuum" has nFin
17960 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ==0..*/.static i
17970 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
17980 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
17990 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
179a0 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
179b0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
179c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
179d0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
179e0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
179f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
17a00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17a10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
17a20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
17a30 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
17a40 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
17a50 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
17a60 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
17a70 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
17a80 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
17a90 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
17aa0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
17ab0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
17ac0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
17ad0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
17ae0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
17af0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
17b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b10 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
17b20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
17b30 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
17b40 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
17b50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17b70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17b80 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
17b90 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
17ba0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17bb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
17bc0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
17bd0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
17be0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
17bf0 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
17c00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
17c10 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
17c20 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
17c30 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
17c40 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
17c50 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
17c60 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
17c70 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
17c80 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
17c90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
17ca0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
17cb0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
17cc0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
17cd0 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
17ce0 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
17cf0 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
17d00 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
17d10 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
17d20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
17d30 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
17d40 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
17d50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
17d60 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
17d70 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
17d80 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
17d90 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
17da0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17db0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
17dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
17de0 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
17df0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
17e00 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
17e10 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
17e20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
17e30 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
17e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17e50 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
17e60 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
17e70 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
17e80 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
17e90 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
17ea0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
17eb0 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
17ec0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
17ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ee0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17ef0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17f00 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
17f10 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
17f20 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
17f30 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
17f40 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
17f50 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
17f60 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
17f70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
17f80 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
17f90 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
17fa0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
17fb0 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
17fc0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
17fd0 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
17fe0 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
17ff0 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
18000 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
18010 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
18020 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
18030 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
18040 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
18050 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
18060 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
18070 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
18080 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
18090 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
180a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
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 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
180e0 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
180f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
18110 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
18120 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
18130 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
18140 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
18150 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
18160 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
18170 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
18180 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
18190 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
181a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
181b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
181c0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
181d0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
181e0 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
181f0 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
18200 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
18210 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
18220 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
18230 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
18270 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
18280 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
18290 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
182a0 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
182b0 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
182c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
182d0 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
182e0 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
182f0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
18300 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
18310 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
18320 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
18330 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
18340 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
18350 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18370 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18390 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
183a0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
183b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
183c0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
183d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
183e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
183f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18400 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18410 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50    }.      iLastP
18420 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g--;.    }.    s
18430 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
18440 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
18450 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a  ager, iLastPg);.
18460 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
18470 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
18480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
184a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
184b0 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
184c0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
184d0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
184e0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
184f0 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
18500 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
18510 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
18520 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
18530 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
18540 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
18550 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
18560 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
18570 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
18580 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
18590 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
185a0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
185b0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
185c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
185d0 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
185e0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
185f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18600 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
18610 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
18620 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18630 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
18640 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18650 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
18660 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18670 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
18680 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
18690 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
186a0 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
186b0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
186c0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
186d0 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
186e0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
186f0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
18700 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
18710 70 28 70 42 74 2c 20 30 2c 20 62 74 72 65 65 50  p(pBt, 0, btreeP
18720 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
18730 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18750 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18760 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
18770 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
18780 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
18790 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
187a0 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
187b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
187c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
187d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
187e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
187f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18800 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
18810 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
18820 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
18830 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
18840 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
18850 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
18860 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
18870 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
18880 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
18890 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
188a0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
188b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
188c0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
188d0 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
188e0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
188f0 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
18900 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
18910 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
18920 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
18930 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
18940 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
18950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
18960 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
18970 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
18980 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18990 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
189a0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
189b0 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
189c0 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
189d0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
189e0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
189f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18a00 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
18a10 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
18a20 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
18a30 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
18a40 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
18a50 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
18a60 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
18a70 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
18a80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18a90 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
18aa0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
18ab0 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
18ac0 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
18ad0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18ae0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
18af0 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
18b00 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  */.    Pgno nPtr
18b10 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  map;      /* Num
18b20 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
18b30 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
18b40 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
18b50 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
18b60 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
18b70 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e   freed */.    in
18b80 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
18b90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
18ba0 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
18bb0 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  map page */.    
18bc0 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
18bd0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
18be0 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
18bf0 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
18c00 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
18c10 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
18c20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
18c30 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
18c40 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
18c50 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
18c60 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
18c70 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
18c80 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
18c90 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
18ca0 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
18cb0 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
18cc0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
18cd0 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
18ce0 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
18cf0 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
18d00 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
18d10 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
18d20 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
18d30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18d40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18d50 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
18d60 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
18d70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
18d80 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d  ]);.    nEntry =
18d90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18da0 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20  /5;.    nPtrmap 
18db0 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
18dc0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
18dd0 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
18de0 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69  /nEntry;.    nFi
18df0 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
18e00 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
18e10 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
18e20 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18e30 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
18e40 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
18e50 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
18e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
18e70 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
18e80 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
18e90 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
18ea0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
18eb0 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
18ec0 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e   }.    if( nFin>
18ed0 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
18ee0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18ef0 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72  PT;..    for(iFr
18f00 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
18f10 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
18f20 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
18f30 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
18f40 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
18f50 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20  nFin, iFree);.  
18f60 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
18f70 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
18f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
18f90 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
18fa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18fb0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
18fc0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
18fd0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
18fe0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
18ff0 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
19000 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
19010 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
19020 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
19030 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
19040 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
19050 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 73 71   nFin);.      sq
19060 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
19070 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
19080 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  ger, nFin);.    
19090 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
190a0 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
190b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
190c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
190d0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
190e0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
190f0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
19100 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
19110 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
19120 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19130 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
19140 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
19150 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
19160 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
19170 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
19180 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
19190 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
191a0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
191b0 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
191c0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
191d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
191e0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
191f0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
19200 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
19210 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
19220 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
19230 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
19240 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
19250 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
19260 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
19270 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
19280 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
19290 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
192a0 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
192b0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
192c0 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
192d0 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
192e0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
192f0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
19300 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
19310 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
19320 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
19330 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
19340 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
19350 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
19360 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
19370 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
19380 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
19390 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
193a0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
193b0 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
193c0 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
193d0 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
193e0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
193f0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
19400 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
19410 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
19420 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
19430 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
19440 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
19450 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
19460 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
19470 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
19480 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
19490 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
194a0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
194b0 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
194c0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
194d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
194e0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
194f0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
19500 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
19510 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
19520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
19530 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
19540 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
19550 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
19560 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
19570 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
19580 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
19590 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
195a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
195b0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
195c0 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
195d0 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
195e0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
195f0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
19600 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
19610 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
19620 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
19630 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
19640 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
19650 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
19660 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
19670 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
19680 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
19690 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
196a0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
196b0 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
196c0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
196d0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
196e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
196f0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
19700 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
19710 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
19720 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19730 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
19740 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
19750 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
19760 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19770 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
19780 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
19790 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
197a0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
197b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
197c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
197d0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
197e0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
197f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
19810 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19820 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
19840 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
19850 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
19860 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
19870 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
19880 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
19890 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
198a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
198b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
198c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
198d0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
198e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
198f0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
19900 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
19910 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
19920 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
19930 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
19940 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
19950 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
19960 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19970 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
19980 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
19990 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 62 74 72  tex(p) );..  btr
199a0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
199b0 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70 2d  t(pBt);.  if( p-
199c0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
199d0 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63  ONE && p->db->ac
199e0 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29 7b  tiveVdbeCnt>1 ){
199f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
19a00 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
19a10 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
19a20 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
19a30 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
19a40 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
19a50 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
19a60 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
19a70 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
19a80 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
19a90 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
19aa0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
19ab0 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
19ac0 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
19ad0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
19ae0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
19af0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
19b00 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
19b10 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
19b20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
19b30 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
19b40 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
19b50 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
19b60 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
19b70 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
19b80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
19b90 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
19ba0 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
19bb0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
19bc0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
19bd0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
19be0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
19bf0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
19c00 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
19c10 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
19c20 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
19c30 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
19c40 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
19c50 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
19c60 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
19c70 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
19c80 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
19c90 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
19ca0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19cb0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
19cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19cd0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
19ce0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
19cf0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
19d00 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
19d10 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
19d20 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
19d30 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
19d40 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
19d50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
19d60 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
19d70 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
19d80 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
19d90 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
19da0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
19db0 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
19dc0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
19dd0 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
19de0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
19df0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19e00 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
19e10 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
19e20 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
19e30 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
19e40 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
19e50 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
19e60 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
19e70 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
19e80 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
19e90 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
19ea0 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
19eb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
19ec0 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
19ed0 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
19ee0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
19ef0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
19f00 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
19f10 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
19f20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
19f30 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
19f40 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
19f50 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
19f60 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
19f70 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
19f80 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
19f90 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
19fa0 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
19fb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
19fc0 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
19fd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
19fe0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
19ff0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
1a000 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1a010 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1a020 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
1a030 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
1a040 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
1a050 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
1a060 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
1a070 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1a080 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
1a090 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
1a0a0 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
1a0b0 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
1a0c0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
1a0d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
1a0e0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
1a0f0 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
1a100 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
1a110 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
1a120 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
1a130 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
1a140 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1a150 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1a160 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
1a170 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
1a180 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a190 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
1a1a0 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
1a1b0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
1a1c0 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
1a1d0 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
1a1e0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
1a1f0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
1a200 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
1a210 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
1a220 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
1a230 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1a240 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
1a250 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
1a260 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
1a270 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
1a280 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
1a290 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
1a2a0 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
1a2b0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
1a2c0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1a2d0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1a2e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a2f0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1a300 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1a310 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1a320 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1a330 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1a340 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1a350 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
1a360 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
1a370 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1a380 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1a390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a3a0 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
1a3b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1a3c0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1a3d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
1a3e0 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
1a3f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1a400 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
1a410 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
1a420 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1a430 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1a440 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
1a450 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
1a460 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a470 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1a480 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
1a490 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a4a0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
1a4b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a4c0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
1a4d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1a4e0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
1a4f0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
1a500 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1a510 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
1a520 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1a530 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1a540 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
1a550 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a560 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1a570 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a580 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
1a590 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1a5a0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74  _READ;.  }..  bt
1a5b0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1a5c0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1a5d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a5e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a5f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
1a600 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
1a610 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
1a620 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1a630 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1a640 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1a650 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a660 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1a670 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1a680 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1a690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a6a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1a6b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1a6c0 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
1a6d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a6e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1a6f0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1a700 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
1a710 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
1a720 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
1a730 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
1a740 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
1a750 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
1a760 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
1a770 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
1a780 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
1a790 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
1a7a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
1a7b0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
1a7c0 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
1a7d0 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
1a7e0 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
1a7f0 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
1a800 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
1a810 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
1a820 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
1a830 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
1a840 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
1a850 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
1a860 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
1a870 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
1a880 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
1a890 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
1a8a0 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
1a8b0 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
1a8c0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
1a8d0 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
1a8e0 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
1a8f0 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
1a900 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
1a910 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
1a920 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
1a930 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
1a940 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1a950 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1a960 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1a970 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a980 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1a990 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
1a9a0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
1a9b0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
1a9c0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
1a9d0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
1a9e0 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
1a9f0 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
1aa00 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
1aa10 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
1aa20 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
1aa30 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
1aa40 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
1aa50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1aa60 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
1aa70 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
1aa80 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
1aa90 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
1aaa0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
1aab0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
1aac0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
1aad0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
1aae0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
1aaf0 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
1ab00 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
1ab10 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
1ab20 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
1ab30 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
1ab40 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
1ab50 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1ab60 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
1ab70 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
1ab80 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
1ab90 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
1aba0 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
1abb0 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
1abc0 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
1abd0 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
1abe0 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
1abf0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1ac00 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
1ac10 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
1ac20 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
1ac30 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
1ac40 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1ac50 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
1ac60 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
1ac70 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1ac80 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1ac90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1aca0 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
1acb0 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
1acc0 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
1acd0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
1ace0 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
1acf0 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
1ad00 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1ad10 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
1ad20 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
1ad30 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
1ad40 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1ad50 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1ad60 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
1ad70 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
1ad80 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1ad90 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
1ada0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
1adb0 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
1adc0 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
1add0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
1ade0 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
1adf0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
1ae00 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
1ae10 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
1ae20 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
1ae30 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
1ae40 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1ae50 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1ae60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ae70 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1ae80 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1ae90 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1aea0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1aeb0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1aec0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
1aed0 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
1aee0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1aef0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1af00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1af10 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
1af20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1af30 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1af40 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1af50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1af60 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1af70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1af80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
1af90 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
1afa0 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
1afb0 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
1afc0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
1afd0 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
1afe0 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
1aff0 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
1b000 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
1b010 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
1b020 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
1b030 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
1b040 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
1b050 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
1b060 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
1b070 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
1b080 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
1b090 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
1b0a0 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
1b0b0 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
1b0c0 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
1b0d0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
1b0e0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
1b0f0 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
1b100 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
1b110 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
1b120 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
1b130 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
1b140 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
1b150 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
1b160 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1b170 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
1b180 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
1b190 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
1b1a0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1b1b0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1b1c0 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
1b1d0 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
1b1e0 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
1b1f0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
1b200 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
1b210 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
1b220 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
1b230 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b240 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
1b250 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1b260 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
1b270 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
1b280 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
1b290 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
1b2a0 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
1b2b0 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
1b2c0 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
1b2d0 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
1b2e0 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
1b2f0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
1b300 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
1b310 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
1b320 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
1b330 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
1b340 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
1b350 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
1b360 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
1b370 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
1b380 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
1b390 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
1b3a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1b3b0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
1b3c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b3d0 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
1b3e0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
1b3f0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1b400 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1b410 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
1b420 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
1b430 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
1b440 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
1b450 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b460 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
1b470 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1b480 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1b490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b4a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b4b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
1b4c0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
1b4d0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1b4e0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1b4f0 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f  on can can be ro
1b500 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
1b510 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
1b520 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
1b530 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
1b540 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
1b550 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
1b560 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
1b570 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1b580 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
1b590 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1b5a0 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
1b5b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
1b5c0 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
1b5d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
1b5e0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1b5f0 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
1b600 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
1b610 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
1b620 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
1b630 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
1b640 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
1b650 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
1b660 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
1b670 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
1b680 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
1b690 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
1b6a0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
1b6b0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1b6c0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1b6d0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1b6e0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1b6f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
1b700 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
1b710 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
1b720 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
1b730 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
1b740 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
1b750 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1b760 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
1b770 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1b780 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
1b790 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
1b7a0 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
1b7b0 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
1b7c0 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
1b7d0 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
1b7e0 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
1b7f0 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
1b800 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
1b810 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
1b820 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
1b830 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
1b840 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
1b850 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
1b860 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
1b870 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1b880 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1b890 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
1b8a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1b8b0 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
1b8c0 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
1b8d0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
1b8e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b8f0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1b900 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b910 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1b920 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1b930 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1b940 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
1b950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1b960 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
1b970 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1b980 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
1b990 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
1b9a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b9b0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1b9c0 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
1b9d0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
1b9e0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1b9f0 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
1ba00 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
1ba10 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
1ba20 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
1ba30 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
1ba40 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
1ba50 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
1ba60 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
1ba70 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
1ba80 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
1ba90 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
1baa0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
1bab0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1bac0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
1bad0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
1bae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1baf0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1bb00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
1bb10 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
1bb20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1bb30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bb40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
1bb50 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1bb60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
1bb70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
1bb80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
1bb90 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
1bba0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
1bbb0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
1bbc0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
1bbd0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
1bbe0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
1bbf0 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
1bc00 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
1bc10 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
1bc20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
1bc30 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
1bc40 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
1bc50 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1bc60 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
1bc70 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
1bc80 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
1bc90 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
1bca0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
1bcb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1bcc0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
1bcd0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
1bce0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
1bcf0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
1bd00 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
1bd10 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
1bd20 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
1bd30 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
1bd40 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
1bd50 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
1bd60 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
1bd70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1bd80 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
1bd90 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
1bda0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
1bdb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1bdc0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
1bdd0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1bde0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1bdf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1be00 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1be10 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
1be20 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
1be30 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1be40 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
1be50 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
1be60 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
1be70 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
1be80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
1be90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1bea0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
1beb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1bec0 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
1bed0 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
1bee0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
1bef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bf00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
1bf10 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 70 42 74  vepoint<0 && pBt
1bf20 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79  ->initiallyEmpty
1bf30 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20   ) pBt->nPage = 
1bf40 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65  0;.      rc = ne
1bf50 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1bf60 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1bf70 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
1bf80 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1bf90 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
1bfa0 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1bfb0 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
1bfc0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
1bfd0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
1bfe0 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
1bff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1c000 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
1c010 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
1c020 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
1c030 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
1c040 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1c050 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
1c060 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1c070 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1c080 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c090 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
1c0a0 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
1c0b0 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
1c0c0 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
1c0d0 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
1c0e0 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
1c0f0 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
1c100 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
1c110 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
1c120 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
1c130 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
1c140 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
1c150 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
1c160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
1c170 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
1c180 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
1c190 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
1c1a0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
1c1b0 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
1c1c0 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
1c1d0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
1c1e0 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
1c1f0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1c200 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
1c210 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
1c220 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
1c230 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
1c240 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
1c250 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
1c260 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
1c270 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
1c280 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
1c290 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
1c2a0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
1c2b0 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
1c2c0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
1c2d0 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
1c2e0 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
1c2f0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
1c300 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
1c310 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
1c320 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
1c330 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1c340 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
1c350 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
1c360 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
1c370 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
1c380 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
1c390 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
1c3a0 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
1c3b0 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
1c3c0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
1c3d0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
1c3e0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
1c3f0 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
1c400 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
1c410 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
1c420 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
1c430 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
1c440 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
1c450 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1c460 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
1c470 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
1c480 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
1c490 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
1c4a0 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
1c4b0 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
1c4c0 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
1c4d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
1c4e0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
1c4f0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1c500 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
1c510 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
1c520 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
1c530 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
1c540 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
1c550 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
1c560 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
1c570 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
1c580 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1c590 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
1c5a0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
1c5b0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1c5c0 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
1c5d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
1c5e0 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
1c5f0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1c600 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
1c610 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
1c620 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1c630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c650 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
1c660 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c680 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
1c690 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
1c6a0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
1c6b0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1c6e0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1c6f0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1c700 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1c710 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1c720 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
1c730 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
1c740 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
1c770 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
1c780 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
1c790 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7b0 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
1c7c0 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73   handle */..  as
1c7d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1c7e0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1c7f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1c800 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
1c810 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ==1 );..  /* The
1c820 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1c830 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72  t statements ver
1c840 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73  ify that if this
1c850 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a   is a sharable .
1c860 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61    ** b-tree data
1c870 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63  base, the connec
1c880 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
1c890 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1c8a0 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20  le locks, .  ** 
1c8b0 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  and that no othe
1c8c0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
1c8d0 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
1c8e0 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
1c8f0 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20  with .  ** this 
1c900 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
1c910 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
1c920 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  heTableLock(p, i
1c930 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21  Table, pKeyInfo!
1c940 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b  =0, wrFlag+1) );
1c950 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1c960 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
1c970 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
1c980 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
1c990 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
1c9a0 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
1c9b0 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
1c9c0 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
1c9d0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1c9e0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
1c9f0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1ca00 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
1ca10 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1ca20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1ca30 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
1ca40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
1ca50 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72  ..  if( NEVER(wr
1ca60 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61  Flag && pBt->rea
1ca70 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65  dOnly) ){.    re
1ca80 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
1ca90 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
1caa0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
1cab0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1cac0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1cad0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
1cae0 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
1caf0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
1cb00 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
1cb10 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
1cb20 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
1cb30 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
1cb40 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
1cb50 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
1cb60 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
1cb70 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
1cb80 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
1cb90 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
1cba0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
1cbb0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
1cbc0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1cbd0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
1cbe0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
1cbf0 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46  pBt;.  pCur->wrF
1cc00 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67  lag = (u8)wrFlag
1cc10 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  ;.  pCur->pNext 
1cc20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
1cc30 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1cc40 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
1cc50 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1cc60 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70  ur;.  }.  pBt->p
1cc70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
1cc80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1cc90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1cca0 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f    pCur->cachedRo
1ccb0 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  wid = 0;.  retur
1ccc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
1ccd0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1cce0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1ccf0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
1cd20 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
1cd30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1cd60 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1cd70 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1cd80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cda0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1cdb0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1cdc0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1cdd0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cdf0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
1ce00 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
1ce10 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1ce40 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
1ce50 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1ce60 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1ce70 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1ce80 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
1ce90 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
1cea0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
1ceb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1cec0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1ced0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cee0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1cef0 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
1cf00 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
1cf10 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
1cf20 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
1cf30 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
1cf40 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
1cf50 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
1cf60 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
1cf70 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
1cf80 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
1cf90 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
1cfa0 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
1cfb0 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
1cfc0 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
1cfd0 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
1cfe0 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
1cff0 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
1d000 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1d010 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
1d020 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
1d030 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
1d040 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1d050 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
1d060 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
1d070 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
1d080 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
1d090 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
1d0a0 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
1d0b0 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
1d0c0 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
1d0d0 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
1d0e0 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
1d0f0 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
1d100 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
1d110 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
1d120 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
1d130 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
1d140 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
1d150 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
1d160 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
1d170 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
1d180 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
1d190 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
1d1a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d1b0 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
1d1c0 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
1d1d0 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
1d1e0 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
1d1f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1d200 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61   cached rowid va
1d210 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72  lue of every cur
1d220 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20  sor in the same 
1d230 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1d240 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76   as pCur and hav
1d250 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ing the same roo
1d260 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  t page number as
1d270 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75   pCur.  The valu
1d280 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69  e is.** set to i
1d290 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  Rowid..**.** Onl
1d2a0 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64  y positive rowid
1d2b0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1d2c0 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72  idered valid for
1d2d0 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20   this cache..** 
1d2e0 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69  The cache is ini
1d2f0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1d300 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
1d310 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a  invalid cache..*
1d320 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77  * A btree will w
1d330 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65  ork fine with ze
1d340 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1d350 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20  owids.  We just 
1d360 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20  cannot.** cache 
1d370 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1d380 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d   rowids, which m
1d390 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74  eans tables that
1d3a0 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20   use zero or.** 
1d3b0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1d3c0 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
1d3d0 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20  le slower.  But 
1d3e0 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72  in practice, zer
1d3f0 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65  o.** or negative
1d400 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79   rowids are very
1d410 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69   uncommon so thi
1d420 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
1d430 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
1d440 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  id sqlite3BtreeS
1d450 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1d460 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71  Cursor *pCur, sq
1d470 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77  lite3_int64 iRow
1d480 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  id){.  BtCursor 
1d490 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72  *p;.  for(p=pCur
1d4a0 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
1d4b0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1d4c0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
1d4d0 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  oot==pCur->pgnoR
1d4e0 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52  oot ) p->cachedR
1d4f0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1d500 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1d510 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d  r->cachedRowid==
1d520 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a  iRowid );.}../*.
1d530 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61  ** Return the ca
1d540 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74  ched rowid for t
1d550 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e  he given cursor.
1d560 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20    A negative or 
1d570 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76  zero.** return v
1d580 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74  alue indicates t
1d590 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61  hat the rowid ca
1d5a0 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61  che is invalid a
1d5b0 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  nd should be.** 
1d5c0 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65  ignored.  If the
1d5d0 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73   rowid cache has
1d5e0 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1d5f0 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a  en set, then a.*
1d600 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * zero is return
1d610 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  ed..*/.sqlite3_i
1d620 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  nt64 sqlite3Btre
1d630 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eGetCachedRowid(
1d640 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d650 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1d660 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a  cachedRowid;.}..
1d670 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
1d680 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
1d690 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1d6a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
1d6b0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
1d6c0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
1d6d0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
1d6e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
1d6f0 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
1d700 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
1d710 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
1d720 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
1d730 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
1d740 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
1d750 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1d760 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1d770 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1d780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1d790 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1d7a0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
1d7b0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
1d7c0 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
1d7d0 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
1d7e0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1d7f0 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
1d800 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
1d810 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1d820 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1d830 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1d840 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
1d850 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
1d860 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1d870 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1d880 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d890 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1d8a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
1d8b0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1d8c0 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
1d8d0 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
1d8e0 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
1d8f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1d900 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
1d910 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1d920 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
1d930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d940 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1d950 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
1d960 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1d970 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
1d980 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
1d990 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
1d9a0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1d9b0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
1d9c0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
1d9d0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
1d9e0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
1d9f0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
1da00 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
1da10 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
1da20 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
1da30 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
1da40 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
1da50 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
1da60 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
1da70 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
1da80 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
1da90 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
1daa0 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
1dab0 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
1dac0 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
1dad0 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
1dae0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1daf0 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
1db00 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
1db10 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
1db20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
1db30 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
1db40 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
1db50 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
1db60 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
1db70 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
1db80 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
1db90 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
1dba0 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
1dbb0 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
1dbc0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1dbd0 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
1dbe0 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
1dbf0 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
1dc00 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
1dc10 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1dc20 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
1dc30 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
1dc40 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1dc50 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1dc60 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
1dc70 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1dc80 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
1dc90 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
1dca0 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
1dcb0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1dcc0 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
1dcd0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
1dce0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
1dcf0 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
1dd00 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
1dd10 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
1dd20 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
1dd30 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
1dd40 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
1dd50 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
1dd60 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
1dd70 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
1dd80 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
1dd90 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
1dda0 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
1ddb0 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
1ddc0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1ddd0 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
1dde0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1ddf0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
1de00 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1de10 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
1de20 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1de30 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1de40 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1de50 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
1de60 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1de70 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
1de80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
1de90 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1dea0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
1deb0 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
1dec0 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
1ded0 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
1dee0 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
1def0 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
1df00 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
1df10 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
1df20 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1df60 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1df70 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1dfb0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1dfc0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20   pCur->iPage;   
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  \.    btreeParse
1e010 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1e020 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1e030 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1e040 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20  r->info); \.    
1e050 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1e060 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e090 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1e0a0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e0f0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1e100 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e140 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
1e150 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65  C_VER */..#ifnde
1e160 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
1e170 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
1e180 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1e190 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1e1a0 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
1e1b0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
1e1c0 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
1e1d0 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
1e1e0 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
1e1f0 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
1e200 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
1e210 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
1e220 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
1e230 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
1e240 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
1e250 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
1e260 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1e270 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
1e280 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1e290 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
1e2a0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1e2b0 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
1e2c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1e2d0 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
1e2e0 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
1e2f0 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1e300 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1e310 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
1e320 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
1e330 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
1e340 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1e350 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
1e360 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1e370 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
1e380 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
1e390 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
1e3a0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
1e3b0 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
1e3c0 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
1e3d0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1e3e0 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
1e3f0 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
1e400 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1e410 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
1e420 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
1e430 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
1e440 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
1e450 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1e460 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
1e470 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
1e480 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
1e490 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1e4a0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
1e4b0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
1e4c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1e4d0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
1e4e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e4f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e500 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e510 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1e520 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
1e530 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e540 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
1e550 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1e560 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1e570 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65  *pSize = 0;.  }e
1e580 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c  lse{.    getCell
1e590 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1e5a0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1e5b0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1e5c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e5d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
1e5e0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
1e5f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1e600 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
1e610 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
1e620 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1e630 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
1e640 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
1e650 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
1e660 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1e670 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
1e680 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
1e690 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1e6a0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1e6b0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
1e6c0 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
1e6d0 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
1e6e0 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
1e6f0 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
1e700 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1e710 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
1e720 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
1e730 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1e740 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
1e750 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
1e760 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
1e770 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
1e780 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
1e790 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
1e7a0 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
1e7b0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
1e7c0 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
1e7d0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1e7e0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1e7f0 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1e800 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e810 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1e830 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1e840 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
1e850 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1e860 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1e870 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72  >info.nData;.  r
1e880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1e8a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e8b0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
1e8c0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
1e8d0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
1e8e0 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
1e8f0 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1e900 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e910 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1e920 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
1e930 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
1e940 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
1e950 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
1e960 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1e970 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
1e980 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
1e990 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
1e9a0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
1e9b0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
1e9c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e9d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e9e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1e9f0 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
1ea00 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
1ea10 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1ea20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1ea30 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1ea40 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1ea50 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
1ea60 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
1ea70 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1ea80 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
1ea90 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
1eaa0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
1eab0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
1eac0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
1ead0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
1eae0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
1eaf0 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
1eb00 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
1eb10 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
1eb20 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
1eb30 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
1eb40 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
1eb50 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
1eb60 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1eb70 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1eb80 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
1eb90 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
1eba0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
1ebb0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
1ebc0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
1ebd0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
1ebe0 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
1ebf0 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
1ec00 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
1ec10 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
1ec20 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
1ec30 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
1ec40 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
1ec50 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
1ec60 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1ec70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
1ec80 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1ec90 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
1eca0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1ecb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1ecc0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1ecd0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
1ece0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1ecf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1ed00 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
1ed10 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
1ed20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
1ed30 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
1ed40 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
1ed50 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1ed60 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
1ed70 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
1ed80 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1ed90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1eda0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1edb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1edc0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1edd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
1ede0 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
1edf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ee00 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
1ee10 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
1ee20 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1ee30 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
1ee40 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
1ee50 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
1ee60 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
1ee70 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
1ee80 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
1ee90 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
1eea0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
1eeb0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
1eec0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
1eed0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
1eee0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
1eef0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
1ef00 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
1ef10 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
1ef20 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
1ef30 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
1ef40 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1ef50 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
1ef60 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
1ef70 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
1ef80 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
1ef90 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
1efa0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1efb0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
1efc0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
1efd0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1efe0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
1eff0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
1f000 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
1f010 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
1f020 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1f030 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
1f040 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
1f050 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f060 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
1f070 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1f080 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
1f090 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
1f0a0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
1f0b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1f0c0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1f0d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1f0e0 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
1f0f0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
1f100 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
1f110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f120 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1f130 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1f140 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1f150 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1f160 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
1f170 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f190 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1f1a0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1f1b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1f1c0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1f1d0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1f1e0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1f1f0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1f200 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1f210 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1f220 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1f230 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1f240 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1f250 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1f260 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
1f270 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
1f280 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
1f290 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
1f2a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1f2b0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
1f2c0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1f2d0 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
1f2e0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
1f2f0 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
1f300 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
1f310 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
1f320 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
1f330 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
1f340 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
1f350 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
1f360 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f370 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1f380 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
1f390 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
1f3a0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
1f3b0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1f3c0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
1f3d0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1f3e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1f3f0 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
1f400 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
1f410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f420 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
1f430 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
1f440 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1f450 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
1f460 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1f470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f480 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1f490 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
1f4a0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
1f4b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f4c0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1f4d0 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4f0 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
1f500 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
1f510 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
1f520 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
1f530 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
1f540 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
1f550 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
1f560 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
1f570 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
1f580 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
1f590 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
1f5a0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
1f5b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f5c0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1f5d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f5e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f5f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
1f600 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1f610 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
1f620 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
1f630 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
1f640 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
1f650 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
1f660 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
1f670 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
1f680 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
1f690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f6a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f6b0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1f6c0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
1f6d0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1f6e0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
1f6f0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
1f700 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1f710 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
1f720 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
1f730 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
1f740 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
1f750 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
1f760 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
1f770 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
1f780 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
1f790 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
1f7a0 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
1f7b0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
1f7c0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
1f7d0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
1f7e0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
1f7f0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
1f800 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
1f810 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1f820 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
1f830 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
1f840 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
1f850 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
1f860 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
1f870 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1f880 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1f890 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
1f8a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
1f8b0 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
1f8c0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1f8d0 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
1f8e0 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
1f8f0 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
1f900 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
1f910 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
1f920 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
1f930 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
1f940 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
1f950 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1f960 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
1f970 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
1f980 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
1f990 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
1f9a0 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
1f9b0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
1f9c0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
1f9d0 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
1f9e0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
1f9f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1fa00 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1fa10 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1fa20 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
1fa30 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
1fa40 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
1fa50 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
1fa60 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
1fa70 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1fa80 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
1fa90 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
1faa0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
1fab0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
1fac0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
1fad0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
1fae0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
1faf0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1fb00 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
1fb10 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1fb20 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1fb30 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1fb40 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1fb50 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1fb60 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1fb70 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1fb80 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1fb90 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1fba0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1fbb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1fbc0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1fbd0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1fbe0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1fbf0 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1fc00 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1fc10 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1fc20 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1fc30 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1fc40 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1fc50 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1fc60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1fc70 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1fc80 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1fc90 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1fca0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
1fcb0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
1fcc0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
1fcd0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
1fce0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1fcf0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
1fd00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fd10 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
1fd20 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
1fd30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1fd40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fd50 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
1fd60 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
1fd70 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
1fd80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fd90 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
1fda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1fdb0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
1fdc0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
1fdd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
1fde0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1fdf0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1fe00 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1fe10 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1fe20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1fe30 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1fe40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1fe50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1fe60 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
1fe70 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1fe80 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1fe90 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
1fea0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
1feb0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
1fec0 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
1fed0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
1fee0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
1fef0 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
1ff00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
1ff10 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
1ff20 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1ff30 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
1ff40 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
1ff50 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
1ff60 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
1ff70 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
1ff80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1ff90 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
1ffa0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1ffb0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ffc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1ffd0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
1ffe0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
1fff0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
20000 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
20010 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
20020 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20030 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
20040 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
20050 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
20060 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
20070 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
20080 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
20090 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
200a0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
200b0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
200c0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
200d0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
200e0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
200f0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
20100 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
20110 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
20120 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
20130 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
20140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20150 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
20160 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
20170 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
20180 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
20190 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
201a0 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
201b0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
201c0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
201d0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
201e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
201f0 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
20200 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
20210 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
20220 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
20230 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
20240 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
20250 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
20260 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
20270 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
20280 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
20290 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
202a0 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
202b0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
202c0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
202d0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
202e0 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
202f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
20300 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
20310 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
20320 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
20330 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
20340 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
20350 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
20360 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
20370 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
20380 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
20390 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
203a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
203b0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
203c0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
203d0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
203e0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
203f0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
20400 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
20410 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
20420 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
20430 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
20440 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
20450 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
20460 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
20470 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69        /* nOvfl i
20480 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  s always positiv
20490 65 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a  e.  If it were z
204a0 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61  ero, fetchPayloa
204b0 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20  d would have.   
204c0 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20     ** been used 
204d0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20  instead of this 
204e0 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  routine. */.    
204f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76    if( ALWAYS(nOv
20500 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  fl) && !pCur->aO
20510 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
20520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
20530 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
20540 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
20550 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
20560 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
20570 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
20580 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
20590 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
205a0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
205b0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
205c0 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
205d0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
205e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
205f0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
20600 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
20610 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
20620 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
20630 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
20640 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
20650 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
20660 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
20670 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
20680 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
20690 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
206a0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
206b0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
206c0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
206d0 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
206e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
206f0 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
20700 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
20710 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
20720 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
20730 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
20740 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
20750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
20760 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
20770 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
20780 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
20790 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
207a0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
207b0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
207c0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
207d0 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
207e0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
207f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
20800 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
20810 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
20820 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
20830 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
20840 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
20850 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
20860 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
20870 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
20880 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
20890 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
208a0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
208b0 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
208c0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
208d0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
208e0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
208f0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
20900 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
20910 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
20920 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
20930 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
20940 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
20950 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
20960 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
20970 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
20980 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
20990 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
209a0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
209b0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
209c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
209d0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
209e0 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
209f0 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
20a00 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
20a10 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
20a20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20a30 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
20a40 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
20a50 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
20a60 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
20a70 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
20a80 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
20a90 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
20aa0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
20ab0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
20ac0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
20ad0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
20ae0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
20af0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
20b00 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
20b10 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
20b20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
20b30 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
20b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
20b50 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
20b60 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
20b70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
20b80 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
20b90 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
20ba0 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
20bb0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
20bc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
20bd0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
20be0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
20bf0 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
20c00 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
20c10 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
20c20 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
20c30 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
20c40 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
20c50 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
20c60 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
20c70 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
20c80 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
20c90 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
20ca0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
20cb0 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
20cc0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
20cd0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
20ce0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20cf0 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
20d00 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
20d10 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
20d20 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
20d30 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
20d40 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
20d50 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
20d60 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
20d70 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
20d80 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
20d90 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
20da0 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
20db0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
20dc0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20dd0 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20       if( eOp==0 
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
20e10 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
20e20 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
20e60 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
20e70 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
20e80 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ea0 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
20eb0 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
20ec0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
20ed0 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
20ee0 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
20ef0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
20f00 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20f10 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
20f40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
20f50 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
20f60 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
20f70 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
20f80 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
20f90 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
20fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20fb0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
20fc0 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
20fd0 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
20fe0 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
20ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
21000 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
21010 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
21020 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
21030 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
21040 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
21050 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
21060 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
21070 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
21080 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21090 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
210a0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
210b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
210c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
210d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
210e0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
210f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
21100 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
21110 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
21120 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
21130 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
21140 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
21150 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
21160 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
21170 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
21180 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21190 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
211a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
211b0 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
211c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
211d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
211e0 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
211f0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
21200 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
21210 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21220 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
21230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21240 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21250 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
21270 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
21280 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
21290 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
212a0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
212b0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
212c0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
212d0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
212e0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
212f0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54  offset"..**.** T
21300 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
21310 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20  nsure that pCur 
21320 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
21330 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e   valid row.** in
21340 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
21350 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
21360 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
21370 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
21380 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
21390 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
213a0 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
213b0 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
213c0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
213d0 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
213e0 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
213f0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
21400 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
21410 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
21420 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
21430 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
21440 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21450 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21460 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21470 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21480 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
21490 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
214a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
214b0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
214c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
214d0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
214e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
214f0 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
21500 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
21510 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
21520 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
21530 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29  d char*)pBuf, 0)
21540 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
21550 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
21560 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21570 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
21580 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
21590 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
215a0 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
215b0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
215c0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
215d0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
215e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
215f0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
21600 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
21610 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
21620 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
21630 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
21640 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
21650 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
21660 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
21670 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
21680 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28  qlite3BtreeData(
21690 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
216a0 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
216b0 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
216c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66  {.  int rc;..#if
216d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
216e0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28  _INCRBLOB.  if (
216f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
21700 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
21710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21720 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65  TE_ABORT;.  }.#e
21730 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
21740 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21750 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
21760 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
21770 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
21780 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21790 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
217a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
217b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
217c0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
217d0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
217e0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
217f0 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73  iPage] );.    as
21800 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
21810 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
21820 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21830 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
21840 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
21850 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
21860 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
21870 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
21880 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21890 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
218a0 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
218b0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
218c0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
218d0 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
218e0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
218f0 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
21900 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
21910 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
21920 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e  if skipKey==0 an
21930 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  d it points to t
21940 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
21950 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b  data if.** skipK
21960 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62  ey==1.  The numb
21970 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
21980 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74  vailable key/dat
21990 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  a is written.** 
219a0 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
219b0 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
219c0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
219d0 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a  d will not be.**
219e0 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
219f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
21a00 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
21a10 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
21a20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
21a30 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
21a40 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
21a50 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
21a60 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
21a70 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
21a80 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
21a90 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
21aa0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
21ab0 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
21ac0 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
21ad0 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
21ae0 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
21af0 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
21b00 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
21b10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
21b20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
21b30 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
21b40 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
21b50 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
21b60 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
21b70 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
21b80 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
21b90 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
21ba0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
21bb0 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
21bc0 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
21bd0 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
21be0 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
21bf0 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
21c00 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
21c10 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
21c20 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
21c30 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
21c40 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
21c50 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c   char *fetchPayl
21c60 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
21c70 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
21c80 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
21c90 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
21ca0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
21cb0 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Amt,           /
21cc0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
21cd0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
21ce0 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  bytes here */.  
21cf0 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20  int skipKey     
21d00 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67       /* read beg
21d10 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69  inning at data i
21d20 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
21d30 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
21d40 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
21d50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
21d60 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
21d70 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61  u32 nLocal;..  a
21d80 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
21d90 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
21da0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
21db0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
21dc0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21dd0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21de0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
21df0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21e00 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50  ex(pCur) );.  pP
21e10 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
21e20 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
21e30 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
21e40 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21e50 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
21e60 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28   );.  if( NEVER(
21e70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
21e80 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65  ==0) ){.    btre
21e90 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
21ea0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21eb0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
21ec0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a  x[pCur->iPage],.
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ee0 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b     &pCur->info);
21ef0 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20  .  }.  aPayload 
21f00 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
21f10 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b  ll;.  aPayload +
21f20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  = pCur->info.nHe
21f30 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67  ader;.  if( pPag
21f40 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
21f50 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c   nKey = 0;.  }el
21f60 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28  se{.    nKey = (
21f70 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
21f80 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  Key;.  }.  if( s
21f90 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50  kipKey ){.    aP
21fa0 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a  ayload += nKey;.
21fb0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
21fc0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
21fd0 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nKey;.  }else{.
21fe0 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75      nLocal = pCu
21ff0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
22000 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63      assert( nLoc
22010 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a  al<=nKey );.  }.
22020 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c    *pAmt = nLocal
22030 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c  ;.  return aPayl
22040 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
22050 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
22060 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
22070 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
22080 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
22090 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
220a0 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
220b0 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
220c0 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
220d0 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
220e0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
220f0 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
22100 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
22110 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
22120 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
22130 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
22140 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
22150 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
22160 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
22170 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
22180 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
22190 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
221a0 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
221b0 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
221c0 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
221d0 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
221e0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
221f0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
22200 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
22210 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
22220 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
22230 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
22240 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
22250 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
22260 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
22270 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
22280 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
22290 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
222a0 74 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43  treeKeyFetch(BtC
222b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
222c0 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74   *pAmt){.  const
222d0 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20   void *p = 0;.  
222e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
222f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
22300 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
22310 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
22320 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22330 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
22340 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53   ALWAYS(pCur->eS
22350 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22360 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  ID) ){.    p = (
22370 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
22380 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
22390 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 0);.  }.  r
223a0 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74  eturn p;.}.const
223b0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
223c0 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
223d0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
223e0 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74   *pAmt){.  const
223f0 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20   void *p = 0;.  
22400 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
22410 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
22420 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
22430 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
22440 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
22450 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
22460 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53   ALWAYS(pCur->eS
22470 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
22480 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28  ID) ){.    p = (
22490 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
224a0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
224b0 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 1);.  }.  r
224c0 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn p;.}.../*.
224d0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
224e0 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
224f0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
22500 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
22510 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
22520 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
22530 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
22540 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
22550 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
22560 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
22570 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
22580 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
22590 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
225a0 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
225b0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
225c0 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
225d0 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
225e0 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
225f0 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
22600 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
22610 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
22620 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
22630 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
22640 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
22650 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
22660 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
22670 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20  t rc;.  int i = 
22680 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d  pCur->iPage;.  M
22690 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65  emPage *pNewPage
226a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
226b0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
226c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
226d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
226e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
226f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22700 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
22710 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
22720 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
22730 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43  EPTH );.  if( pC
22740 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
22750 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
22760 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
22770 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22780 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  KPT;.  }.  rc = 
22790 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
227a0 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e  Bt, newPgno, &pN
227b0 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  ewPage);.  if( r
227c0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
227d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b   pCur->apPage[i+
227e0 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  1] = pNewPage;. 
227f0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31   pCur->aiIdx[i+1
22800 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
22810 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d  Page++;..  pCur-
22820 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
22830 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
22840 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e  ey = 0;.  if( pN
22850 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20  ewPage->nCell<1 
22860 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74  || pNewPage->int
22870 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67  Key!=pCur->apPag
22880 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[i]->intKey ){.
22890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
228a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
228b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
228c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
228d0 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
228e0 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
228f0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
22900 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
22910 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
22920 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
22930 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
22940 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
22950 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
22960 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
22970 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
22980 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
22990 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
229a0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
229b0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
229c0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
229d0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
229e0 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
229f0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
22a00 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
22a10 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
22a20 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
22a30 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
22a40 6c 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ld){.  assert( i
22a50 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
22a60 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
22a70 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
22a80 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
22a90 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
22aa0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
22ab0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
22ac0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
22ad0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
22ae0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
22af0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
22b00 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
22b10 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
22b20 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
22b30 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
22b40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
22b50 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
22b60 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
22b70 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
22b80 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
22b90 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
22ba0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
22bb0 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
22bc0 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
22bd0 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
22be0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
22bf0 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
22c00 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
22c10 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
22c20 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
22c30 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
22c40 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
22c50 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
22c60 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
22c70 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
22c80 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
22c90 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
22ca0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22cb0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22cc0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
22cd0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
22ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
22cf0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
22d00 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
22d10 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
22d20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
22d30 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
22d40 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
22d50 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
22d60 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
22d70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22d80 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c  >pgno.  );.  rel
22d90 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
22da0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
22db0 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  e]);.  pCur->iPa
22dc0 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ge--;.  pCur->in
22dd0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
22de0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
22df0 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  = 0;.}../*.** Mo
22e00 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
22e10 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
22e20 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
22e30 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
22e40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
22e50 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
22e60 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
22e70 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
22e80 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
22e90 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
22ea0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
22eb0 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
22ec0 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
22ed0 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
22ee0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
22ef0 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
22f00 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
22f10 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
22f20 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
22f30 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
22f40 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
22f50 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
22f60 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
22f70 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
22f80 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
22f90 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
22fa0 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
22fb0 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
22fc0 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
22fd0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
22fe0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
22ff0 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
23000 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
23010 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
23020 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
23030 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
23040 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
23050 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
23060 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
23070 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
23080 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
23090 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
230a0 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
230b0 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
230c0 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
230d0 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
230e0 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
230f0 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
23100 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
23110 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
23120 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
23130 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
23140 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
23150 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
23160 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
23170 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
23180 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
23190 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
231a0 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
231b0 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
231c0 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
231d0 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
231e0 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
231f0 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
23200 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
23210 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
23220 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
23230 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
23240 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
23250 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
23260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
23270 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
23280 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
23290 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
232a0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
232b0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
232c0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
232d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c  CURSOR_INVALID <
232e0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
232f0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
23300 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20   CURSOR_VALID   
23310 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
23320 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
23330 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20  ( CURSOR_FAULT  
23340 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   > CURSOR_REQUIR
23350 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70  ESEEK );.  if( p
23360 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
23370 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
23380 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
23390 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
233a0 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61  FAULT ){.      a
233b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
233c0 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b  pNext!=SQLITE_OK
233d0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
233e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
233f0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23400 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
23410 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20  or(pCur);.  }.. 
23420 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
23430 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >=0 ){.    int i
23440 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
23450 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
23460 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
23470 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
23480 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
23490 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
234a0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
234b0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
234c0 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 ){.    pCur->e
234d0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
234e0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75  NVALID;.    retu
234f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23500 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
23510 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
23520 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
23530 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
23540 65 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  e[0]);.    if( r
23550 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
23560 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
23570 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
23580 4c 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72  LID;.      retur
23590 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
235a0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
235b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 43 75 72  ..    /* If pCur
235c0 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
235d0 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
235e0 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
235f0 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
23600 20 20 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20      ** expected 
23610 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
23620 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
23630 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
23640 79 49 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20  yInfo is.    ** 
23650 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72  NULL, the caller
23660 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65   expects a table
23670 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73   b-tree. If this
23680 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
23690 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20  ,.    ** return 
236a0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
236b0 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20  T error.  */.   
236c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
236d0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
236e0 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==1 || pCur->apP
236f0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
23700 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 43  0 );.    if( (pC
23710 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
23720 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  !=pCur->apPage[0
23730 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
23740 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23750 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
23760 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
23770 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 72  ssert that the r
23780 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 66 20 74  oot page is of t
23790 68 65 20 63 6f 72 72 65 63 74 20 74 79 70 65 2e  he correct type.
237a0 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 74 68   This must be th
237b0 65 0a 20 20 2a 2a 20 63 61 73 65 20 61 73 20 74  e.  ** case as t
237c0 68 65 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  he call to this 
237d0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f  function that lo
237e0 61 64 65 64 20 74 68 65 20 72 6f 6f 74 2d 70 61  aded the root-pa
237f0 67 65 20 28 65 69 74 68 65 72 0a 20 20 2a 2a 20  ge (either.  ** 
23800 74 68 69 73 20 63 61 6c 6c 20 6f 72 20 61 20 70  this call or a p
23810 72 65 76 69 6f 75 73 20 69 6e 76 6f 63 61 74 69  revious invocati
23820 6f 6e 29 20 77 6f 75 6c 64 20 68 61 76 65 20 64  on) would have d
23830 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
23840 6f 6e 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  on .  ** if the 
23850 61 73 73 75 6d 70 74 69 6f 6e 20 77 65 72 65 20  assumption were 
23860 6e 6f 74 20 74 72 75 65 2c 20 61 6e 64 20 69 74  not true, and it
23870 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
23880 20 66 6f 72 20 74 68 65 20 66 6c 61 67 73 20 0a   for the flags .
23890 20 20 2a 2a 20 62 79 74 65 20 74 6f 20 68 61 76    ** byte to hav
238a0 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
238b0 77 68 69 6c 65 20 74 68 69 73 20 63 75 72 73 6f  while this curso
238c0 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
238d0 65 66 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f  eference.  ** to
238e0 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20   the page.  */. 
238f0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
23900 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
23910 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
23920 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
23930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  );.  assert( pRo
23940 6f 74 2d 3e 69 73 49 6e 69 74 20 26 26 20 28 70  ot->isInit && (p
23950 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
23960 29 3d 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  )==pRoot->intKey
23970 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49   );..  pCur->aiI
23980 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
23990 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
239a0 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73  0;.  pCur->atLas
239b0 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  t = 0;.  pCur->v
239c0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
239d0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
239e0 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
239f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
23a00 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
23a10 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
23a20 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
23a30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
23a40 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
23a50 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
23a60 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
23a70 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
23a80 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
23a90 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
23aa0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
23ab0 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
23ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
23ad0 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52  r->eState = ((pR
23ae0 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55  oot->nCell>0)?CU
23af0 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f  RSOR_VALID:CURSO
23b00 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a  R_INVALID);.  }.
23b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23b20 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
23b30 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
23b40 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
23b50 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
23b60 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
23b70 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
23b80 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
23b90 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
23ba0 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
23bb0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
23bc0 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
23bd0 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
23be0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
23bf0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
23c00 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
23c10 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
23c20 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
23c30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
23c40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
23c50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
23c60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
23c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23c80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23c90 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
23ca0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
23cb0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
23cc0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23cd0 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
23ce0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
23cf0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23d00 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
23d10 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
23d20 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
23d30 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
23d40 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23d50 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
23d60 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
23d70 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
23d80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23d90 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
23da0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
23db0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
23dc0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
23dd0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
23de0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
23df0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
23e00 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
23e10 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
23e20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
23e30 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
23e40 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
23e50 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
23e60 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
23e70 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
23e80 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
23e90 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
23ea0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
23eb0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
23ec0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
23ed0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
23ee0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
23ef0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
23f00 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
23f10 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
23f20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
23f30 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
23f40 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
23f50 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
23f60 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
23f70 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
23f80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
23f90 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
23fa0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23fb0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23fc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23fd0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23fe0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
23ff0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
24000 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
24010 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24020 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
24030 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
24040 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
24050 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
24060 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
24070 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
24080 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
24090 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
240a0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
240b0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
240c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
240d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
240e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
240f0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
24100 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ll-1;.    pCur->
24110 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
24120 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
24130 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
24140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
24150 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
24160 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
24170 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
24180 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
24190 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
241a0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
241b0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
241c0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
241d0 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
241e0 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
241f0 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
24200 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
24210 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
24220 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
24230 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
24240 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
24250 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
24260 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
24270 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
24280 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
24290 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
242a0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
242b0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
242c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
242d0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
242e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
242f0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
24300 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24310 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
24320 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24330 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
24340 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
24350 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
24360 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
24370 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
24380 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
24390 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
243a0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
243b0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
243c0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
243d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
243e0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
243f0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
24400 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
24410 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
24420 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
24430 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
24440 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
24450 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
24460 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
24470 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
24480 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
24490 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
244a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
244b0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
244c0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
244d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
244e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
244f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
24500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
24510 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
24520 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
24530 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
24540 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
24550 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
24560 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
24570 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
24580 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
24590 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
245a0 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e  eState && pCur->
245b0 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66  atLast ){.#ifdef
245c0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
245d0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
245e0 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
245f0 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
24600 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
24610 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
24620 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
24630 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
24640 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
24650 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
24660 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
24670 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
24680 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
24690 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
246a0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
246b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
246c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
246d0 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
246e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
246f0 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
24700 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
24710 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
24720 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
24730 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
24740 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
24750 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
24760 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
24770 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24780 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
24790 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
247a0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
247b0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
247c0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
247d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
247e0 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
247f0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
24800 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24810 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
24820 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24830 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
24840 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
24850 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
24860 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
24870 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
24880 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
24890 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  1:0;.    }.  }. 
248a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
248b0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
248c0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
248d0 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
248e0 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
248f0 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
24900 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
24910 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
24920 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
24930 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
24940 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
24950 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
24960 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
24970 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
24980 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
24990 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
249a0 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
249b0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
249c0 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
249d0 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
249e0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
249f0 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
24a00 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
24a10 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
24a20 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
24a30 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
24a40 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
24a50 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
24a60 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
24a70 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
24a80 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
24a90 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
24aa0 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
24ab0 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
24ac0 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
24ad0 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
24ae0 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
24af0 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
24b00 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
24b10 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
24b20 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
24b30 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
24b40 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
24b50 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
24b60 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
24b70 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
24b80 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
24b90 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
24ba0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
24bb0 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
24bc0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
24bd0 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
24be0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c00 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
24c10 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
24c20 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
24c30 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
24c40 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
24c50 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
24c60 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
24c70 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
24c90 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
24ca0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
24cb0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
24cc0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
24cd0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
24ce0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
24cf0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
24d00 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
24d10 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
24d20 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
24d30 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
24d40 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
24d50 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
24d60 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
24d70 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
24d80 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
24d90 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
24da0 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
24db0 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
24dc0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
24dd0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
24de0 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
24df0 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
24e00 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
24e10 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
24e20 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
24e30 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
24e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24e50 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
24e60 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
24e70 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
24e80 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
24e90 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
24ea0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24eb0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
24ec0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
24ed0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
24ee0 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
24ef0 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
24f00 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
24f10 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
24f20 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
24f30 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
24f40 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
24f50 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
24f60 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
24f70 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
24f80 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
24f90 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
24fa0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
24fb0 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d  R_VALID && pCur-
24fc0 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26  >validNKey .   &
24fd0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  & pCur->apPage[0
24fe0 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a  ]->intKey .  ){.
24ff0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
25000 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
25010 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
25020 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
25030 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25040 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
25050 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e  atLast && pCur->
25060 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
25070 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
25080 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
25090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
250a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20    }.  }..  rc = 
250b0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
250c0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
250d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
250e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
250f0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
25100 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25110 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
25120 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
25130 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
25140 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25150 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b  Page]->isInit );
25160 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25170 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25180 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
25190 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
251a0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
251b0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
251c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
251d0 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  LID ){.    *pRes
251e0 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72   = -1;.    asser
251f0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
25200 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
25210 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25220 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
25230 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25240 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
25250 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
25260 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49  0]->intKey || pI
25270 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
25280 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
25290 20 75 70 72 2c 20 69 64 78 3b 0a 20 20 20 20 50   upr, idx;.    P
252a0 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20  gno chldPg;.    
252b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
252c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
252d0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
252e0 69 6e 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70  int c;..    /* p
252f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
25300 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
25310 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
25320 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
25330 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
25340 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
25350 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
25360 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
25370 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
25380 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
25390 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
253a0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
253b0 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
253c0 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
253d0 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
253e0 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
253f0 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
25400 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
25410 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
25420 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
25430 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
25440 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
25450 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
25460 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
25470 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
25480 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
25490 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
254a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
254b0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
254c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
254d0 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
254e0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
254f0 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
25500 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
25510 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74     if( biasRight
25520 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
25530 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
25540 65 5d 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d  e] = (u16)(idx =
25550 20 75 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65   upr);.    }else
25560 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  {.      pCur->ai
25570 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25580 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20 28   = (u16)(idx = (
25590 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20  upr+lwr)/2);.   
255a0 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a   }.    for(;;){.
255b0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
255e0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
255f0 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
25600 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
25610 69 64 78 3d 3d 70 43 75 72 2d 3e 61 69 49 64 78  idx==pCur->aiIdx
25620 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
25630 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  .      pCur->inf
25640 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
25650 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
25660 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20  ell(pPage, idx) 
25670 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
25680 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  rSize;.      if(
25690 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
256a0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43  {.        i64 nC
256b0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
256c0 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
256d0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
256e0 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  u32 dummy;.     
256f0 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65       pCell += ge
25700 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c  tVarint32(pCell,
25710 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20   dummy);.       
25720 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
25730 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
25740 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
25750 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
25760 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
25770 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
25780 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
25790 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
257a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
257b0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
257c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
257d0 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e  ssert( nCellKey>
257e0 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20  intKey );.      
257f0 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20      c = +1;.    
25800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 43      }.        pC
25810 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
25820 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
25830 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
25840 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c  llKey;.      }el
25850 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
25860 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
25870 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
25880 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
25890 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
258a0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
258b0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
258c0 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
258d0 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
258e0 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
258f0 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
25900 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
25910 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
25920 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
25930 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
25940 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
25950 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
25960 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
25970 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
25980 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
25990 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
259a0 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
259b0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
259c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
259d0 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
259e0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
259f0 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
25a00 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
25a10 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
25a20 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
25a30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
25a40 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  nt nCell = pCell
25a50 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
25a60 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38 30 29   !(nCell & 0x80)
25a70 0a 20 20 20 20 20 20 20 20 20 26 26 20 6e 43 65  .         && nCe
25a80 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ll<=pPage->maxLo
25a90 63 61 6c 0a 20 20 20 20 20 20 20 20 20 26 26 20  cal.         && 
25aa0 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 29 3c  (pCell+nCell+1)<
25ab0 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
25ac0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
25ad0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
25ae0 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
25af0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
25b00 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
25b10 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
25b20 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
25b30 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
25b40 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
25b50 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
25b60 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
25b70 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
25b80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
25b90 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
25ba0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
25bb0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
25bc0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
25bd0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
25be0 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
25bf0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
25c00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
25c10 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
25c20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
25c30 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
25c40 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
25c50 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
25c60 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 20 20  Local.          
25c70 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  && (pCell+nCell+
25c80 32 29 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  2)<=pPage->aData
25c90 45 6e 64 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  End.        ){. 
25ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25cb0 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
25cc0 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
25cd0 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
25ce0 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
25cf0 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
25d00 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
25d10 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
25d20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
25d30 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
25d40 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
25d50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
25d60 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
25d70 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
25d80 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
25d90 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
25da0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25db0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
25dc0 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
25dd0 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
25de0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
25df0 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
25e00 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
25e10 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
25e20 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
25e30 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
25e40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
25e50 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
25e60 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
25e70 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
25e80 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
25e90 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
25ea0 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
25eb0 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
25ec0 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ed. */.         
25ed0 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b   void *pCellKey;
25ee0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20  .          u8 * 
25ef0 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20  const pCellBody 
25f00 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d  = pCell - pPage-
25f10 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
25f20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61           btreePa
25f30 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
25f40 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43  , pCellBody, &pC
25f50 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
25f60 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e       nCell = (in
25f70 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  t)pCur->info.nKe
25f80 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65  y;.          pCe
25f90 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
25fa0 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a  alloc( nCell );.
25fb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
25fc0 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
25fd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25fe0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
25ff0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
26000 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
26010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26020 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
26030 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43  load(pCur, 0, nC
26040 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ell, (unsigned c
26050 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30  har*)pCellKey, 0
26060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26070 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
26080 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26090 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
260a0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
260b0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
260c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
260d0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
260e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
260f0 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
26100 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
26110 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26120 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
26130 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26140 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
26150 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
26160 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
26170 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
26180 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b        lwr = idx;
26190 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
261a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
261b0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
261c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
261d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
261e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
261f0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
26200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
26210 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
26220 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
26230 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
26240 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
26250 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
26260 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
26270 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
26280 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26290 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
262a0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
262b0 36 29 28 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  6)(idx = (lwr+up
262c0 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  r)/2);.    }.   
262d0 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
262e0 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69  r+1 || (pPage->i
262f0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
26300 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73  >leaf) );.    as
26310 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
26320 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  nit );.    if( p
26330 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
26340 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a      chldPg = 0;.
26350 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77      }else if( lw
26360 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r>=pPage->nCell 
26370 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
26380 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
26390 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
263a0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
263b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
263c0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
263d0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
263e0 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20  , lwr));.    }. 
263f0 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d 30     if( chldPg==0
26400 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
26410 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
26420 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
26430 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
26440 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
26450 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a       *pRes = c;.
26460 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26470 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f  E_OK;.      goto
26480 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
26490 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
264a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
264b0 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  e] = (u16)lwr;. 
264c0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
264d0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
264e0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
264f0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
26500 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c  oChild(pCur, chl
26510 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  dPg);.    if( rc
26520 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
26530 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74  inish;.  }.movet
26540 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75  o_finish:.  retu
26550 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
26560 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
26570 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
26580 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
26590 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
265a0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
265b0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
265c0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
265d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
265e0 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
265f0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
26600 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
26610 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
26620 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
26630 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
26640 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
26650 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
26660 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
26670 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
26680 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
26690 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
266a0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
266b0 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
266c0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
266d0 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
266e0 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
266f0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
26700 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
26710 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
26720 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
26730 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
26740 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
26750 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
26760 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
26770 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
26780 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
26790 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
267a0 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
267b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
267c0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
267d0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
267e0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
267f0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
26800 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
26810 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
26820 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
26830 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
26840 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
26850 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
26860 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
26870 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
26880 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
26890 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
268a0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
268b0 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
268c0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
268d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
268e0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
268f0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
26900 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
26910 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26920 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
26930 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
26940 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69  ( pRes!=0 );.  i
26950 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
26960 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
26970 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
26980 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26990 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
269a0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
269b0 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
269c0 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
269d0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
269e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
269f0 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
26a00 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20  kipNext = 0;..  
26a10 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
26a20 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26a30 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
26a40 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26a50 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
26a60 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
26a70 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
26a80 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
26a90 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
26aa0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
26ab0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
26ac0 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
26ad0 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
26ae0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
26af0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
26b00 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
26b10 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
26b20 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
26b30 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
26b40 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
26b50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
26b60 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
26b70 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
26b80 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
26b90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26ba0 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
26bb0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
26bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
26bd0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
26be0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
26bf0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
26c00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
26c10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
26c20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
26c30 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
26c40 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
26c50 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
26c60 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
26c70 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
26c80 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
26c90 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a  ->nCell );.    *
26ca0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  pRes = 0;.    if
26cb0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
26cc0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
26cd0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
26ce0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
26cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
26d00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
26d10 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
26d20 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
26d30 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  0;.  if( pPage->
26d40 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
26d50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26d60 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c  }.  rc = moveToL
26d70 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
26d80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
26d90 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
26da0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
26db0 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
26dc0 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
26dd0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
26de0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
26df0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
26e00 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
26e10 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
26e20 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
26e30 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
26e40 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
26e50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
26e60 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
26e70 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
26e80 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
26e90 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
26ea0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
26eb0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
26ec0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
26ed0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26ee0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26ef0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
26f00 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
26f10 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
26f20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26f30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26f40 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73   }.  pCur->atLas
26f50 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52  t = 0;.  if( CUR
26f60 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
26f70 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
26f80 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
26f90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26fa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
26fb0 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
26fc0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
26fd0 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  xt = 0;.    *pRe
26fe0 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
26ff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
27000 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  .  pCur->skipNex
27010 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  t = 0;..  pPage 
27020 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
27030 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
27040 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
27050 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
27060 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
27070 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
27080 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
27090 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
270a0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
270b0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
270c0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
270d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
270e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
270f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
27100 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
27110 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
27120 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
27130 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27140 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
27150 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
27160 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
27170 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
27180 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
27190 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
271a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
271b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
271c0 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
271d0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
271e0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  }.    pCur->info
271f0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
27200 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
27210 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  = 0;..    pCur->
27220 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27230 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
27240 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
27250 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
27260 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
27270 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
27280 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
27290 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
272a0 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
272b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
272c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
272d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
272e0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
272f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27300 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
27310 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
27320 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
27330 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
27340 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
27350 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
27360 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
27370 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
27380 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
27390 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
273a0 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
273b0 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
273c0 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
273d0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
273e0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
273f0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
27400 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
27410 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
27420 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
27430 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
27440 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
27450 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
27460 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
27470 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
27480 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
27490 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
274a0 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
274b0 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
274c0 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
274d0 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
274e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
274f0 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
27500 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
27510 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
27520 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
27530 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
27540 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
27550 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
27560 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
27570 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
27580 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
27590 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
275a0 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
275b0 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
275c0 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
275d0 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
275e0 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
275f0 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
27600 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
27610 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
27620 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
27630 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
27640 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
27650 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
27660 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
27670 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
27680 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
27690 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
276a0 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
276b0 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
276c0 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
276d0 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
276e0 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
276f0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
27700 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
27710 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
27720 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
27730 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
27740 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
27750 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
27760 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
27770 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
27780 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
27790 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
277a0 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
277b0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
277c0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
277d0 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
277e0 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
277f0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
27800 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
27810 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
27820 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
27830 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
27840 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
27850 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
27860 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
27870 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
27880 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
27890 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
278a0 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20  ex) );.  pPage1 
278b0 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
278c0 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50   mxPage = btreeP
278d0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
278e0 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
278f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
27900 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
27910 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
27920 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
27930 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27940 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
27950 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
27960 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
27970 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
27980 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
27990 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
279a0 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
279b0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
279c0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
279d0 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
279e0 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
279f0 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
27a00 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ' */.    .    /*
27a10 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20   If the 'exact' 
27a20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72  parameter was tr
27a30 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  ue and a query o
27a40 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
27a50 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
27a60 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
27a70 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
27a80 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
27a90 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
27aa0 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
27ab0 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
27ac0 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
27ad0 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
27ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
27af0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
27b00 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d  xact && nearby<=
27b10 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
27b20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
27b30 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
27b40 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
27b50 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
27b60 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
27b70 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
27b80 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
27b90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
27ba0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
27bb0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
27bc0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
27bd0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
27be0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
27bf0 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
27c00 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
27c10 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
27c20 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
27c30 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
27c40 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
27c50 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
27c60 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
27c70 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
27c80 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
27c90 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
27ca0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
27cb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27cc0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
27cd0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
27ce0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
27cf0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
27d00 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
27d10 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
27d20 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
27d30 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
27d40 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
27d50 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
27d60 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
27d70 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
27d80 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
27d90 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
27da0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
27db0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
27dc0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
27dd0 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
27de0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
27df0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
27e00 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
27e10 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
27e20 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
27e30 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
27e40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
27e50 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27e60 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
27e70 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
27e80 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
27e90 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
27ea0 63 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78  case( iTrunk==mx
27eb0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Page );.      if
27ec0 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  ( iTrunk>mxPage 
27ed0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
27ee0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27ef0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
27f00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
27f10 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
27f20 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
27f30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
27f40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
27f50 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
27f60 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
27f70 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
27f80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27f90 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d  assert( pTrunk!=
27fa0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
27fb0 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  t( pTrunk->aData
27fc0 21 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20  !=0 );..      k 
27fd0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
27fe0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f  nk->aData[4]); /
27ff0 2a 20 23 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  * # of leaves on
28000 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
28010 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   */.      if( k=
28020 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
28030 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
28040 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
28050 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
28060 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
28070 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
28080 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
28090 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
280a0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
280b0 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
280c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
280d0 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
280e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
280f0 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
28100 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28110 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
28120 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
28130 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
28140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
28150 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
28160 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
28170 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
28180 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
28190 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
281a0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
281b0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
281c0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
281d0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
281e0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
281f0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
28200 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
28210 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
28220 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
28230 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
28240 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
28250 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
28260 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
28270 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
28280 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
28290 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
282a0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
282b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
282c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
282d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
282e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
282f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28300 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
28310 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
28320 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62  rchList && nearb
28330 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20  y==iTrunk ){.   
28340 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
28350 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
28360 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
28370 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
28380 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
28390 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
283a0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
283b0 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
283c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
283d0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
283e0 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20  o==iTrunk );.   
283f0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
28400 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
28410 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
28420 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28430 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
28440 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
28450 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
28460 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
28470 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
28480 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
28490 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
284a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
284b0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
284c0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
284d0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
284e0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
284f0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
28500 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28510 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28520 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
28530 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
28540 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28550 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28570 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
28580 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
28590 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
285a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
285b0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
285c0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
285d0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
285e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
285f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28600 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
28610 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
28620 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
28630 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
28640 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
28650 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
28660 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
28670 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
28680 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
28690 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
286a0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
286b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
286c0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
286d0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
286e0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
286f0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
28700 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
28710 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
28720 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
28730 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
28740 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
28750 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
28760 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
28770 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
28780 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
28790 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
287a0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
287b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
287c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
287d0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
287e0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
287f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28810 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
28820 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
28830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28840 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
28850 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
28860 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
28870 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
28880 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28890 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
288a0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
288b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
288c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
288d0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
288e0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
288f0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
28900 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
28910 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
28920 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
28930 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
28940 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
28950 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
28960 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
28970 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
28980 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
28990 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
289a0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
289b0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
289c0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
289d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
289e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
289f0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
28a00 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
28a10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
28a20 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
28a30 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
28a40 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
28a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28a60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28a70 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
28a80 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
28a90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
28aa0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
28ab0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
28ac0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
28ad0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28ae0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
28af0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
28b00 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
28b10 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
28b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28b30 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
28b40 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
28b50 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
28b60 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
28b70 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
28b80 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
28b90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
28ba0 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
28bb0 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
28bc0 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
28bd0 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
28be0 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
28bf0 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
28c00 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
28c10 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
28c20 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
28c30 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
28c40 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
28c50 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  i;.          int
28c60 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
28c70 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
28c80 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73          dist = s
28c90 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
28ca0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
28cb0 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
28cc0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
28cd0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
28ce0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
28cf0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
28d00 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
28d10 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
28d20 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
28d30 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
28d50 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
28d60 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
28d70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
28d80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28d90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28da0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
28db0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
28dc0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
28dd0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
28de0 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
28df0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
28e00 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
28e10 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
28e20 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
28e30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28e40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
28e50 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
28e60 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
28e70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28e80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
28e90 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
28ea0 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
28eb0 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d  chList || iPage=
28ec0 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
28ed0 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65       int noConte
28ee0 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  nt;.          *p
28ef0 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
28f00 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
28f10 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73  ALLOCATE: %d was
28f20 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f   leaf %d of %d o
28f30 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20  n trunk %d".    
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20               ": 
28f50 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67  %d more free pag
28f60 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
28f70 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20          *pPgno, 
28f80 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54  closest+1, k, pT
28f90 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29  runk->pgno, n-1)
28fa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
28fb0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28fc0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
28fd0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
28fe0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
28ff0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
29000 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
29010 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20  losest<k-1 ){.  
29020 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
29030 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
29040 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b  t*4], &aData[4+k
29050 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  *4], 4);.       
29060 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
29070 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34  ut4byte(&aData[4
29080 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
29090 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21     noContent = !
290a0 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65  btreeGetHasConte
290b0 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b  nt(pBt, *pPgno);
290c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
290d0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
290e0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
290f0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
29100 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
29110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29120 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
29130 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29140 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
29150 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
29160 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29170 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
29180 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
29190 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
291a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
291b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
291c0 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
291d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
291e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
291f0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
29200 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
29210 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
29220 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
29230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
29240 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
29250 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
29260 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
29270 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
29280 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
29290 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20   file */.    rc 
292a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
292b0 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
292c0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
292d0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
292e0 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  c;.    pBt->nPag
292f0 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74  e++;.    if( pBt
29300 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
29310 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
29320 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a  ) pBt->nPage++;.
29330 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29340 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29350 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
29360 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41  oVacuum && PTRMA
29370 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42  P_ISPAGE(pBt, pB
29380 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20  t->nPage) ){.   
29390 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
293a0 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
293b0 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
293c0 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
293d0 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
293e0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
293f0 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
29400 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
29410 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
29420 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
29430 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
29440 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
29450 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
29460 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
29470 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
29480 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  *pPg = 0;.      
29490 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
294a0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
294b0 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
294c0 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74  ap page)\n", pBt
294d0 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20  ->nPage));.     
294e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50   assert( pBt->nP
294f0 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age!=PENDING_BYT
29500 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
29510 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
29520 65 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  etPage(pBt, pBt-
29530 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 31 29  >nPage, &pPg, 1)
29540 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
29550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29560 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
29570 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
29580 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
29590 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
295a0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
295b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
295c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74  rn rc;.      pBt
295d0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
295e0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
295f0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
29600 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e  GE(pBt) ){ pBt->
29610 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d  nPage++; }.    }
29620 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34  .#endif.    put4
29630 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70  byte(28 + (u8*)p
29640 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
29650 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  a, pBt->nPage);.
29660 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
29670 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73  ->nPage;..    as
29680 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
29690 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
296a0 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
296b0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
296c0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
296d0 65 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 1);.    if( r
296e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
296f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29700 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
29710 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
29720 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29730 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
29740 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
29750 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
29760 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
29770 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
29780 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
29790 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
297a0 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
297b0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
297c0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
297d0 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
297e0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
297f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
29800 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72  vTrunk);.  if( r
29810 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29820 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
29830 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
29840 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
29850 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
29860 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
29870 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
29880 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29890 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
298a0 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
298b0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
298c0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
298d0 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
298e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
298f0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
29900 77 72 69 74 65 61 62 6c 65 28 28 2a 70 70 50 61  writeable((*ppPa
29910 67 65 29 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge)->pDbPage) );
29920 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29930 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
29940 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
29950 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
29960 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
29970 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
29980 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
29990 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
299a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
299b0 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
299c0 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
299d0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
299e0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
299f0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
29a00 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
29a10 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
29a20 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
29a30 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
29a40 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
29a50 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
29a60 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
29a70 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
29a80 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
29a90 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
29aa0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
29ab0 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
29ac0 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
29ad0 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
29ae0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
29af0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
29b00 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
29b10 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
29b20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
29b30 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
29b40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
29b50 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
29b60 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
29b70 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
29b80 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
29b90 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29bb0 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
29bc0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
29bd0 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
29be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29bf0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
29c00 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
29c10 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
29c20 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
29c30 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
29c40 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
29c50 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
29c60 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29c80 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
29c90 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
29ca0 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
29cb0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cd0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
29ce0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d00 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
29d10 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
29d20 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
29d30 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
29d40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
29d50 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
29d60 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65  .  assert( iPage
29d70 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
29d80 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
29d90 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
29da0 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65  ge );..  if( pMe
29db0 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
29dc0 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
29dd0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
29de0 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
29df0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
29e00 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
29e10 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
29e20 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
29e30 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
29e40 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
29e50 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
29e60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29e70 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
29e80 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
29e90 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
29ea0 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
29eb0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
29ec0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
29ed0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
29ee0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
29ef0 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
29f00 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b  >secureDelete ){
29f10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
29f20 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
29f30 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
29f40 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
29f50 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
29f60 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
29f70 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
29f80 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
29f90 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
29fa0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
29fb0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
29fc0 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
29fd0 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
29fe0 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
29ff0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2a000 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
2a010 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
2a020 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2a030 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
2a040 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
2a050 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
2a060 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
2a070 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2a080 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2a090 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
2a0a0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
2a0b0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
2a0c0 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
2a0d0 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
2a0e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
2a0f0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2a100 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2a110 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
2a120 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
2a130 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2a140 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2a150 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
2a160 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
2a170 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
2a180 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
2a190 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
2a1a0 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
2a1b0 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
2a1c0 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
2a1d0 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
2a1e0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
2a1f0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2a200 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
2a210 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
2a220 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
2a230 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
2a240 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
2a250 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
2a260 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
2a270 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
2a280 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
2a290 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
2a2a0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
2a2b0 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
2a2c0 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
2a2d0 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
2a2e0 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
2a2f0 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
2a300 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
2a310 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
2a320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a330 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
2a340 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
2a350 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
2a360 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
2a370 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2a380 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
2a390 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2a3a0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2a3b0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2a3c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a3d0 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2a3e0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2a3f0 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
2a400 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
2a410 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
2a420 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
2a430 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
2a440 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
2a450 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
2a460 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
2a470 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a480 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2a490 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
2a4a0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
2a4b0 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
2a4c0 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
2a4d0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
2a4e0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
2a4f0 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
2a500 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
2a510 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
2a520 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
2a530 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
2a540 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
2a550 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
2a560 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
2a570 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
2a580 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
2a590 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
2a5a0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
2a5b0 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
2a5c0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
2a5d0 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
2a5e0 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
2a5f0 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
2a600 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
2a610 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2a620 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
2a630 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
2a640 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
2a650 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
2a660 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
2a670 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
2a680 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
2a690 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
2a6a0 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
2a6b0 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
2a6c0 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
2a6d0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
2a6e0 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
2a6f0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
2a700 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
2a710 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
2a720 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
2a730 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
2a740 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
2a750 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
2a760 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
2a770 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
2a780 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
2a790 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
2a7a0 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
2a7b0 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
2a7c0 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
2a7d0 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
2a7e0 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
2a7f0 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
2a800 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
2a810 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
2a820 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
2a830 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2a840 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2a850 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2a860 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
2a870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2a880 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
2a890 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
2a8a0 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
2a8b0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2a8c0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2a8d0 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
2a8e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2a8f0 50 61 67 65 20 26 26 20 21 70 42 74 2d 3e 73 65  Page && !pBt->se
2a900 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
2a910 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
2a920 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
2a930 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2a940 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a950 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
2a960 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
2a970 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
2a980 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
2a990 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
2a9a0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
2a9b0 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
2a9c0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
2a9d0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
2a9e0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
2a9f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
2aa00 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
2aa10 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
2aa20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
2aa30 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
2aa40 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
2aa50 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
2aa60 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
2aa70 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2aa80 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
2aa90 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
2aaa0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
2aab0 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
2aac0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
2aad0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
2aae0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
2aaf0 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
2ab00 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
2ab10 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
2ab20 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
2ab30 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
2ab40 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2ab50 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
2ab60 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
2ab70 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2ab80 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2ab90 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
2aba0 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
2abb0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2abc0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2abd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2abe0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2abf0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ac00 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
2ac10 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
2ac20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
2ac30 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
2ac40 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
2ac50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
2ac60 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
2ac70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2ac80 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
2ac90 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2aca0 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
2acb0 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
2acc0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
2acd0 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
2ace0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
2acf0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
2ad00 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
2ad10 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2ad20 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
2ad30 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2ad40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
2ad50 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
2ad60 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
2ad70 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
2ad80 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
2ad90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
2ada0 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
2adb0 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
2adc0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
2add0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
2ade0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
2adf0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
2ae00 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
2ae10 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
2ae20 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
2ae30 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
2ae40 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
2ae50 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2ae60 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2ae70 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
2ae80 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
2ae90 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
2aea0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
2aeb0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
2aec0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2aed0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2aee0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2aef0 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
2af00 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
2af10 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66  ll, &info);.  if
2af20 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2af30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2af40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
2af50 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
2af60 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
2af70 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
2af80 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
2af90 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
2afa0 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61  low+3 > pPage->a
2afb0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
2afc0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
2afd0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2afe0 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
2aff0 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
2b000 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
2b010 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
2b020 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
2b030 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
2b040 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
2b050 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
2b060 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
2b070 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2b080 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
2b090 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
2b0a0 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
2b0b0 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
2b0c0 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
2b0d0 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
2b0e0 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
2b0f0 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
2b100 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
2b110 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
2b120 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2b130 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
2b140 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
2b150 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2b160 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
2b170 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
2b180 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
2b190 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
2b1a0 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
2b1b0 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
2b1c0 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
2b1d0 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
2b1e0 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
2b1f0 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
2b200 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2b210 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
2b220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2b230 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2b240 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
2b250 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
2b260 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
2b270 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
2b280 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
2b290 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2b2a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2b2b0 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
2b2c0 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
2b2d0 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2b2e0 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
2b2f0 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
2b300 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2b310 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
2b320 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
2b330 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
2b340 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
2b350 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
2b360 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
2b370 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
2b380 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
2b390 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
2b3a0 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
2b3b0 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
2b3c0 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
2b3d0 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
2b3e0 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
2b3f0 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
2b400 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
2b410 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
2b420 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
2b430 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
2b440 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
2b450 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2b460 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
2b470 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
2b480 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
2b490 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
2b4a0 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
2b4b0 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
2b4c0 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
2b4d0 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
2b4e0 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
2b4f0 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
2b500 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
2b510 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
2b520 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
2b530 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
2b540 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
2b550 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
2b560 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
2b570 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
2b580 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
2b590 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
2b5a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2b5b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2b5c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
2b5d0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
2b5e0 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
2b5f0 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
2b600 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
2b610 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
2b620 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2b630 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
2b640 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2b650 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2b660 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
2b670 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
2b680 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2b690 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
2b6a0 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
2b6b0 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
2b6c0 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
2b6d0 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
2b6e0 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
2b6f0 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
2b700 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
2b710 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
2b720 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
2b730 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
2b740 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
2b750 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
2b760 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
2b770 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
2b780 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
2b790 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
2b7a0 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
2b7b0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
2b7c0 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
2b7d0 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
2b7e0 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
2b7f0 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
2b800 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
2b810 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
2b820 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
2b830 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
2b840 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
2b850 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
2b860 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
2b870 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
2b880 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
2b890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2b8a0 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
2b8b0 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
2b8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2b8d0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
2b8e0 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
2b8f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2b900 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2b910 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
2b920 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
2b930 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2b940 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
2b950 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
2b960 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2b970 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
2b980 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
2b990 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9b0 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
2b9c0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
2b9d0 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
2b9e0 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ba00 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
2ba10 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2ba20 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
2ba30 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
2ba40 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
2ba50 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
2ba60 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
2ba70 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
2ba80 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
2ba90 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
2baa0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
2bab0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
2bac0 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
2bad0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2bae0 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
2baf0 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
2bb00 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
2bb10 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
2bb20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2bb30 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2bb40 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
2bb50 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
2bb60 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
2bb70 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
2bb80 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
2bb90 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
2bba0 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
2bbb0 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
2bbc0 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
2bbd0 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
2bbe0 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
2bbf0 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
2bc00 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2bc10 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2bc20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2bc30 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2bc40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2bc50 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
2bc60 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
2bc70 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
2bc80 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2bc90 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
2bca0 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
2bcb0 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
2bcc0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
2bcd0 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
2bce0 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
2bcf0 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
2bd00 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
2bd10 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
2bd20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
2bd30 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
2bd40 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
2bd50 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65 65 50 61  nKey);.  btreePa
2bd60 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2bd70 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
2bd80 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2bd90 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
2bda0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2bdb0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
2bdc0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2bdd0 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
2bde0 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
2bdf0 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
2be00 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
2be10 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
2be20 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
2be30 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
2be40 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2be50 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
2be60 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
2be70 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
2be80 69 66 28 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30  if( NEVER(nKey>0
2be90 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b 65  x7fffffff || pKe
2bea0 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 72  y==0) ){.      r
2beb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2bec0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
2bed0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
2bee0 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
2bef0 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
2bf00 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
2bf10 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
2bf20 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
2bf30 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
2bf40 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
2bf50 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
2bf60 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
2bf70 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
2bf80 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
2bf90 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
2bfa0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
2bfb0 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
2bfc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2bfd0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2bfe0 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
2bff0 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
2c000 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2c010 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
2c020 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
2c030 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2c040 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
2c050 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
2c060 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
2c070 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
2c080 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
2c090 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
2c0a0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
2c0b0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2c0c0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
2c0d0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2c0e0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
2c0f0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2c100 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
2c110 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
2c120 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c130 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2c140 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2c150 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
2c160 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
2c170 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
2c180 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
2c190 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2c1a0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
2c1b0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
2c1c0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
2c1d0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
2c1e0 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
2c1f0 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
2c200 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
2c210 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
2c220 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
2c230 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
2c240 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
2c250 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
2c260 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
2c270 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
2c280 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
2c290 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
2c2a0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
2c2b0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
2c2c0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
2c2d0 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
2c2e0 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
2c2f0 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73   the uninitialis
2c300 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
2c310 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
2c320 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
2c330 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
2c340 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2c350 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2c360 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
2c370 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c380 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
2c390 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
2c3a0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
2c3b0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
2c3c0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
2c3d0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
2c3e0 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
2c3f0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
2c400 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2c410 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
2c420 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
2c430 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2c440 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2c450 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2c460 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
2c470 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2c480 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2c490 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2c4a0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2c4b0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
2c4c0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
2c4d0 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
2c4e0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2c4f0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2c500 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2c510 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
2c520 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
2c530 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
2c540 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2c550 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
2c560 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
2c570 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
2c580 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
2c590 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
2c5a0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
2c5b0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
2c5c0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
2c5d0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2c5e0 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
2c5f0 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
2c600 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2c610 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2c620 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2c630 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2c640 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2c650 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
2c660 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
2c670 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
2c680 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2c690 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
2c6a0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
2c6b0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
2c6c0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
2c6d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
2c6e0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
2c6f0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
2c700 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
2c710 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
2c720 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2c730 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
2c740 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
2c750 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
2c760 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
2c770 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
2c780 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
2c790 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
2c7a0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
2c7b0 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
2c7c0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
2c7d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
2c7e0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
2c7f0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
2c800 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
2c810 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
2c820 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2c830 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
2c840 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
2c850 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
2c860 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
2c870 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
2c880 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
2c890 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
2c8a0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2c8b0 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
2c8c0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
2c8d0 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
2c8e0 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
2c8f0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
2c900 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2c910 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2c920 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2c930 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2c940 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
2c950 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
2c960 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
2c970 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
2c980 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
2c990 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
2c9a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2c9b0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
2c9c0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
2c9d0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
2c9e0 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
2c9f0 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
2ca00 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
2ca10 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
2ca20 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
2ca30 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
2ca40 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2ca50 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
2ca60 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
2ca70 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2ca80 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
2ca90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2caa0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
2cab0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
2cac0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
2cad0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
2cae0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
2caf0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
2cb00 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
2cb10 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
2cb20 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
2cb30 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
2cb40 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
2cb50 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
2cb60 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2cb70 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
2cb80 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
2cb90 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
2cba0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
2cbb0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
2cbc0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
2cbd0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
2cbe0 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
2cbf0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2cc00 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
2cc10 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
2cc20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
2cc30 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
2cc40 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
2cc50 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
2cc60 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2cc70 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
2cc80 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
2cc90 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
2cca0 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
2ccb0 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
2ccc0 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e  ta[] */.  u8 *en
2ccd0 64 50 74 72 3b 20 20 20 20 20 2f 2a 20 45 6e 64  dPtr;     /* End
2cce0 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e   of loop */.  in
2ccf0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
2cd00 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
2cd10 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
2cd20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
2cd30 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
2cd40 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
2cd50 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
2cd60 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2cd70 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2cd80 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
2cd90 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2cda0 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
2cdb0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
2cdc0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2cdd0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2cde0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2cdf0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
2ce00 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ce10 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2ce20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
2ce30 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2ce40 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
2ce50 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
2ce60 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
2ce70 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
2ce80 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2ce90 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
2cea0 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
2ceb0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
2cec0 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
2ced0 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
2cee0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
2cef0 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
2cf00 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2cf10 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
2cf20 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2cf30 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
2cf40 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2cf50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
2cf60 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
2cf70 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
2cf80 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
2cf90 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
2cfa0 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2cfb0 20 20 7d 0a 20 20 65 6e 64 50 74 72 20 3d 20 26    }.  endPtr = &
2cfc0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
2cfd0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  2*pPage->nCell -
2cfe0 20 32 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28   2];.  assert( (
2cff0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
2d000 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29 3b 20  T(ptr)&1)==0 ); 
2d010 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77 61 79   /* ptr is alway
2d020 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  s 2-byte aligned
2d030 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 74 72   */.  while( ptr
2d040 3c 65 6e 64 50 74 72 20 29 7b 0a 20 20 20 20 2a  <endPtr ){.    *
2d050 28 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31  (u16*)ptr = *(u1
2d060 36 2a 29 26 70 74 72 5b 32 5d 3b 0a 20 20 20 20  6*)&ptr[2];.    
2d070 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20  ptr += 2;.  }.  
2d080 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
2d090 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2d0a0 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
2d0b0 6e 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d  nCell);.  pPage-
2d0c0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a  >nFree += 2;.}..
2d0d0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
2d0e0 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
2d0f0 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
2d100 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
2d110 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
2d120 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
2d130 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
2d140 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
2d150 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
2d160 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
2d170 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
2d180 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
2d190 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
2d1a0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
2d1b0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
2d1c0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
2d1d0 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
2d1e0 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
2d1f0 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
2d200 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76  ** in pPage->aOv
2d210 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
2d220 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
2d230 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
2d240 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
2d250 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
2d260 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
2d270 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
2d280 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
2d290 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
2d2a0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
2d2b0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
2d2c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
2d2d0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
2d2e0 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69  **.** If nSkip i
2d2f0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
2d300 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65   do not copy the
2d310 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
2d320 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c  es of the.** cel
2d330 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69  l. The caller wi
2d340 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65  ll overwrite the
2d350 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  m after this fun
2d360 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49  ction returns. I
2d370 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f  f.** nSkip is no
2d380 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65  n-zero, then pCe
2d390 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74  ll may not point
2d3a0 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d   to an invalid m
2d3b0 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a  emory location .
2d3c0 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53  ** (but pCell+nS
2d3d0 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61  kip is always va
2d3e0 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lid)..*/.static 
2d3f0 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
2d400 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d410 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
2d420 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
2d430 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
2d440 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
2d450 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
2d460 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
2d470 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
2d480 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
2d490 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2d4a0 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
2d4b0 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
2d4c0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
2d4d0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
2d4e0 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
2d4f0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
2d500 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
2d510 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
2d520 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
2d530 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
2d540 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
2d550 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
2d560 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
2d570 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
2d580 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
2d590 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
2d5a0 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
2d5b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
2d5c0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
2d5d0 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
2d5e0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
2d5f0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
2d600 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
2d610 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2d620 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20  .  int end;     
2d630 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
2d640 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73 74  te past the last
2d650 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
2d660 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
2d670 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f   ins;          /
2d680 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b  * Index in data[
2d690 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c  ] where new cell
2d6a0 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65   pointer is inse
2d6b0 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65  rted */.  int ce
2d6c0 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41  llOffset;   /* A
2d6d0 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74 20  ddress of first 
2d6e0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  cell pointer in 
2d6f0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  data[] */.  u8 *
2d700 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
2d710 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
2d720 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
2d730 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2d740 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f        /* Used fo
2d750 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61  r moving informa
2d760 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64  tion around in d
2d770 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65  ata[] */.  u8 *e
2d780 6e 64 50 74 72 3b 20 20 20 20 20 20 20 2f 2a 20  ndPtr;       /* 
2d790 45 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  End of the loop 
2d7a0 2a 2f 0a 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20  */..  int nSkip 
2d7b0 3d 20 28 69 43 68 69 6c 64 20 3f 20 34 20 3a 20  = (iChild ? 4 : 
2d7c0 30 29 3b 0a 0a 20 20 69 66 28 20 2a 70 52 43 20  0);..  if( *pRC 
2d7d0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
2d7e0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
2d7f0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
2d800 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
2d810 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d820 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
2d830 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26 20  (pPage->pBt) && 
2d840 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
2d850 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
2d860 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2d870 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
2d880 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
2d890 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2d8a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2d8b0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2d8c0 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
2d8d0 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72   cell should nor
2d8e0 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63  mally be sized c
2d8f0 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76  orrectly.  Howev
2d900 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20  er, when moving 
2d910 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64  a.  ** malformed
2d920 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61   cell from a lea
2d930 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74  f page to an int
2d940 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74  erior page, if t
2d950 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a  he cell size.  *
2d960 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c  * wanted to be l
2d970 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20 67  ess than 4 but g
2d980 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ot rounded up to
2d990 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20   4 on the leaf, 
2d9a0 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d  then size.  ** m
2d9b0 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68 61  ight be less tha
2d9c0 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b  n 8 (leaf-size +
2d9d0 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65   pointer) on the
2d9e0 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20   interior node. 
2d9f0 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   Hence.  ** the 
2da00 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c  term after the |
2da10 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  | in the followi
2da20 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a  ng assert(). */.
2da30 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
2da40 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2da50 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
2da60 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
2da70 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
2da80 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
2da90 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
2daa0 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
2dab0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
2dac0 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c  Temp+nSkip, pCel
2dad0 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
2dae0 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  p);.      pCell 
2daf0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
2db00 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
2db10 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
2db20 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
2db30 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
2db40 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
2db50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
2db60 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
2db70 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
2db80 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
2db90 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ])) );.    pPage
2dba0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c  ->aOvfl[j].pCell
2dbb0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
2dbc0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64  age->aOvfl[j].id
2dbd0 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d 65  x = (u16)i;.  }e
2dbe0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
2dbf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2dc00 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
2dc10 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
2dc20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dc30 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
2dc40 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2dc50 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
2dc60 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2dc70 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2dc80 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
2dc90 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
2dca0 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  a;.    cellOffse
2dcb0 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
2dcc0 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
2dcd0 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
2dce0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2dcf0 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73    ins = cellOffs
2dd00 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63  et + 2*i;.    rc
2dd10 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
2dd20 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
2dd30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2dd40 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
2dd50 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
2dd60 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
2dd70 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
2dd80 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
2dd90 67 20 74 77 6f 20 70 72 6f 70 65 72 74 69 65 73  g two properties
2dda0 0a 20 20 20 20 2a 2a 20 69 66 20 69 74 20 72 65  .    ** if it re
2ddb0 74 75 72 6e 73 20 73 75 63 63 65 73 73 20 2a 2f  turns success */
2ddc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2ddd0 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20   >= end+2 );.   
2dde0 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
2ddf0 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
2de00 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
2de10 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
2de20 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll++;.    pPage-
2de30 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
2de40 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
2de50 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e 53  cpy(&data[idx+nS
2de60 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  kip], pCell+nSki
2de70 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2de80 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
2de90 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2dea0 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c  data[idx], iChil
2deb0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 74  d);.    }.    pt
2dec0 72 20 3d 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a  r = &data[end];.
2ded0 20 20 20 20 65 6e 64 50 74 72 20 3d 20 26 64 61      endPtr = &da
2dee0 74 61 5b 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73  ta[ins];.    ass
2def0 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52  ert( (SQLITE_PTR
2df00 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d  _TO_INT(ptr)&1)=
2df10 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73  =0 );  /* ptr is
2df20 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61   always 2-byte a
2df30 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68  ligned */.    wh
2df40 69 6c 65 28 20 70 74 72 3e 65 6e 64 50 74 72 20  ile( ptr>endPtr 
2df50 29 7b 0a 20 20 20 20 20 20 2a 28 75 31 36 2a 29  ){.      *(u16*)
2df60 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74  ptr = *(u16*)&pt
2df70 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72  r[-2];.      ptr
2df80 20 2d 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20   -= 2;.    }.   
2df90 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2dfa0 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20  ins], idx);.    
2dfb0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
2dfc0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2dfd0 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
2dfe0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2dff0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2e000 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  M.    if( pPage-
2e010 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
2e020 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
2e030 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69   cell may contai
2e040 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
2e050 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
2e060 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20   If so, write.  
2e070 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79      ** the entry
2e080 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
2e090 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  w page into the 
2e0a0 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20  pointer map..   
2e0b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d     */.      ptrm
2e0c0 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
2e0d0 67 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b  ge, pCell, pRC);
2e0e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2e0f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  }.}../*.** Add a
2e100 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74   list of cells t
2e110 6f 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70  o a page.  The p
2e120 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  age should be in
2e130 69 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a  itially empty..*
2e140 2a 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20  * The cells are 
2e150 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
2e160 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a  t on the page..*
2e170 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2e180 73 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65  semblePage(.  Me
2e190 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
2e1a0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62  /* The page to b
2e1b0 65 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a  e assemblied */.
2e1c0 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
2e1d0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
2e1e0 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
2e1f0 64 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a  d to this page *
2e200 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c  /.  u8 **apCell,
2e210 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
2e220 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73  s to cell bodies
2e230 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65   */.  u16 *aSize
2e240 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73          /* Sizes
2e250 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f   of the cells */
2e260 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
2e270 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2e280 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
2e290 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f  *pCellptr;     /
2e2a0 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
2e2b0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
2e2c0 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79  /.  int cellbody
2e2d0 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
2e2e0 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f   of next cell bo
2e2f0 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  dy */.  u8 * con
2e300 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
2e310 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  >aData;         
2e320 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2e330 6f 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  o data for pPage
2e340 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
2e350 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2e360 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
2e370 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
2e380 65 61 64 65 72 20 6f 6e 20 70 50 61 67 65 20 2a  eader on pPage *
2e390 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55  /.  const int nU
2e3a0 73 61 62 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70  sable = pPage->p
2e3b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20  Bt->usableSize; 
2e3c0 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f  /* Usable size o
2e3d0 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73  f page */..  ass
2e3e0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2e3f0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
2e400 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2e410 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2e420 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2e430 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d   assert( nCell>=
2e440 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74  0 && nCell<=(int
2e450 29 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  )MX_CELL(pPage->
2e460 70 42 74 29 0a 20 20 20 20 20 20 20 20 20 20 20  pBt).           
2e470 20 26 26 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c   && (int)MX_CELL
2e480 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
2e490 39 32 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  921);.  assert( 
2e4a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2e4b0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2e4c0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
2e4d0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2e4e0 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65  page has just be
2e4f0 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72  en zeroed by zer
2e500 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73  oPage() */.  ass
2e510 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2e520 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2e530 28 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  ( get2byteNotZer
2e540 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d  o(&data[hdr+5])=
2e550 3d 6e 55 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70  =nUsable );..  p
2e560 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 61 67 65  Cellptr = &pPage
2e570 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c  ->aCellIdx[nCell
2e580 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20  *2];.  cellbody 
2e590 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72  = nUsable;.  for
2e5a0 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30  (i=nCell-1; i>=0
2e5b0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20  ; i--){.    u16 
2e5c0 73 7a 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20  sz = aSize[i];. 
2e5d0 20 20 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32     pCellptr -= 2
2e5e0 3b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d  ;.    cellbody -
2e5f0 3d 20 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79  = sz;.    put2by
2e600 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c  te(pCellptr, cel
2e610 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
2e620 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
2e630 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73  y], apCell[i], s
2e640 7a 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79  z);.  }.  put2by
2e650 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2e660 20 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62   nCell);.  put2b
2e670 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
2e680 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  , cellbody);.  p
2e690 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2e6a0 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c  nCell*2 + nUsabl
2e6b0 65 20 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  e - cellbody);. 
2e6c0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
2e6d0 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  (u16)nCell;.}../
2e6e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2e6f0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
2e700 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
2e710 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
2e720 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
2e730 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
2e740 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
2e750 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
2e760 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2e770 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
2e780 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
2e790 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
2e7a0 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
2e7b0 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
2e7c0 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
2e7d0 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
2e7e0 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
2e7f0 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
2e800 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
2e810 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2e820 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
2e830 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
2e840 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
2e850 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
2e860 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
2e870 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
2e880 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
2e890 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
2e8a0 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
2e8b0 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
2e8c0 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
2e8d0 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
2e8e0 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
2e8f0 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
2e900 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
2e910 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
2e920 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
2e930 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
2e940 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
2e950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e960 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
2e970 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
2e980 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
2e990 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
2e9a0 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
2e9b0 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
2e9c0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
2e9d0 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
2e9e0 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
2e9f0 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
2ea00 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
2ea10 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
2ea20 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
2ea30 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
2ea40 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
2ea50 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
2ea60 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
2ea70 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
2ea80 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
2ea90 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
2eaa0 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
2eab0 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
2eac0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
2ead0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
2eae0 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f  ead of trying to
2eaf0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
2eb00 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
2eb10 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
2eb20 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
2eb30 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
2eb40 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
2eb50 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
2eb60 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
2eb70 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
2eb80 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
2eb90 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
2eba0 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
2ebb0 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
2ebc0 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
2ebd0 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
2ebe0 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
2ebf0 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
2ec00 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
2ec10 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
2ec20 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
2ec30 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
2ec40 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
2ec50 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
2ec60 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
2ec70 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
2ec80 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
2ec90 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
2eca0 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
2ecb0 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
2ecc0 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
2ecd0 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
2ece0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
2ecf0 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
2ed00 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  ** The pSpace bu
2ed10 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  ffer is used to 
2ed20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72  store a temporar
2ed30 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69  y copy of the di
2ed40 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68  vider.** cell th
2ed50 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  at will be inser
2ed60 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ted into pParent
2ed70 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f  . Such a cell co
2ed80 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a  nsists of a 4.**
2ed90 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
2eda0 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  r followed by a 
2edb0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2edc0 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65  integer. In othe
2edd0 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d  r.** words, at m
2ede0 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65  ost 13 bytes. He
2edf0 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62  nce the pSpace b
2ee00 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74  uffer must be at
2ee10 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74  .** least 13 byt
2ee20 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
2ee30 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2ee40 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
2ee50 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67  *pParent, MemPag
2ee60 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53  e *pPage, u8 *pS
2ee70 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65  pace){.  BtShare
2ee80 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70  d *const pBt = p
2ee90 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Page->pBt;    /*
2eea0 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65   B-Tree Database
2eeb0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2eec0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2eed0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2eee0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
2eef0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
2ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ef20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2ef30 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20   Pgno pgnoNew;  
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef50 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
2ef60 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a  mber of pNew */.
2ef70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ef80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2ef90 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2efa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2efb0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2efc0 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
2efd0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
2efe0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2eff0 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rflow==1 );..  /
2f000 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e  * This error con
2f010 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61  dition is now ca
2f020 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65  ught prior to re
2f030 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63  aching this func
2f040 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50  tion */.  if( pP
2f050 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20  age->nCell<=0 ) 
2f060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2f070 52 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f  RRUPT_BKPT;..  /
2f080 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
2f090 20 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65   page. This page
2f0a0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2f0b0 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f   right-sibling o
2f0c0 66 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d  f .  ** pPage. M
2f0d0 61 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  ake the parent p
2f0e0 61 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f  age writable, so
2f0f0 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69   that the new di
2f100 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20  vider cell.  ** 
2f110 6d 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e  may be inserted.
2f120 20 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f   If both these o
2f130 70 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75  perations are su
2f140 63 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65  ccessful, procee
2f150 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  d..  */.  rc = a
2f160 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2f170 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
2f180 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20  noNew, 0, 0);.. 
2f190 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2f1a0 4f 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70  OK ){..    u8 *p
2f1b0 4f 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d  Out = &pSpace[4]
2f1c0 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  ;.    u8 *pCell 
2f1d0 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  = pPage->aOvfl[0
2f1e0 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36  ].pCell;.    u16
2f1f0 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
2f200 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2f210 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74  ll);.    u8 *pSt
2f220 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  op;..    assert(
2f230 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2f240 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70  riteable(pNew->p
2f250 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61  DbPage) );.    a
2f260 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
2f270 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54  ata[0]==(PTF_INT
2f280 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
2f290 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20  |PTF_LEAF) );.  
2f2a0 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
2f2b0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
2f2c0 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
2f2d0 46 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  F);.    assemble
2f2e0 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70  Page(pNew, 1, &p
2f2f0 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a  Cell, &szCell);.
2f300 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2f310 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
2f320 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
2f330 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
2f340 61 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65  ap.    ** with e
2f350 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e  ntries for the n
2f360 65 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79  ew page, and any
2f370 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
2f380 65 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  e .    ** cell o
2f390 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e  n the page to an
2f3a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2f3b0 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
2f3c0 73 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  se.    ** operat
2f3d0 69 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20  ions fails, the 
2f3e0 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73  return code is s
2f3f0 65 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74  et, but the cont
2f400 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ents.    ** of t
2f410 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61  he parent page a
2f420 72 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c  re still manipul
2f430 61 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65  ated by thh code
2f440 20 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54   below..    ** T
2f450 68 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68  hat is Ok, at th
2f460 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72  is point the par
2f470 65 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72  ent page is guar
2f480 61 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a  anteed to.    **
2f490 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
2f4a0 72 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61  rty. Returning a
2f4b0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c  n error code wil
2f4c0 6c 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a  l cause a.    **
2f4d0 20 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69   rollback, undoi
2f4e0 6e 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d  ng any changes m
2f4f0 61 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e  ade to the paren
2f500 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
2f510 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2f520 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72  UUM ){.      ptr
2f530 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2f540 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
2f550 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
2f560 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
2f570 28 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d  ( szCell>pNew->m
2f580 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  inLocal ){.     
2f590 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
2f5a0 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c  Ptr(pNew, pCell,
2f5b0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20   &rc);.      }. 
2f5c0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43     }.  .    /* C
2f5d0 72 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20  reate a divider 
2f5e0 63 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69  cell to insert i
2f5f0 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65  nto pParent. The
2f600 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20   divider cell.  
2f610 20 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66    ** consists of
2f620 20 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e   a 4-byte page n
2f630 75 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20  umber (the page 
2f640 6e 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29  number of pPage)
2f650 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61   and.    ** a va
2f660 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65  riable length ke
2f670 79 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d  y value (which m
2f680 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
2f690 76 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20  value as the.   
2f6a0 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20   ** largest key 
2f6b0 6f 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a  on pPage)..    *
2f6c0 2a 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64  *.    ** To find
2f6d0 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
2f6e0 20 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c   value on pPage,
2f6f0 20 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20   first find the 
2f700 72 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20  right-most .    
2f710 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2f720 2e 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20  . The first two 
2f730 66 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63  fields of this c
2f740 65 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20  ell are the .   
2f750 20 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74   ** record-lengt
2f760 68 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65  h (a variable le
2f770 6e 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20  ngth integer at 
2f780 6d 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20  most 32-bits in 
2f790 73 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64  size).    ** and
2f7a0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28   the key value (
2f7b0 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2f7c0 68 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68  h integer, may h
2f7d0 61 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a  ave any value)..
2f7e0 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
2f7f0 20 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e   of the while(..
2f800 2e 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73  .) loops below s
2f810 6b 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65  kips over the re
2f820 63 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20  cord-length.    
2f830 2a 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65  ** field. The se
2f840 63 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20  cond while(...) 
2f850 6c 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20  loop copies the 
2f860 6b 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  key value from t
2f870 68 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  he.    ** cell o
2f880 6e 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65  n pPage into the
2f890 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a   pSpace buffer..
2f8a0 20 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c      */.    pCell
2f8b0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
2f8c0 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  e, pPage->nCell-
2f8d0 31 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20  1);.    pStop = 
2f8e0 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2f8f0 68 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b  hile( (*(pCell++
2f900 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
2f910 3c 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53  <pStop );.    pS
2f920 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b  top = &pCell[9];
2f930 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28  .    while( ((*(
2f940 70 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c  pOut++) = *(pCel
2f950 6c 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70  l++))&0x80) && p
2f960 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20  Cell<pStop );.. 
2f970 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
2f980 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
2f990 6c 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  l into pParent. 
2f9a0 2a 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c  */.    insertCel
2f9b0 6c 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65  l(pParent, pPare
2f9c0 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63  nt->nCell, pSpac
2f9d0 65 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53  e, (int)(pOut-pS
2f9e0 70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20  pace),.         
2f9f0 20 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e        0, pPage->
2fa00 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20  pgno, &rc);..   
2fa10 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68   /* Set the righ
2fa20 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
2fa30 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f  of pParent to po
2fa40 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
2fa50 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34  age. */.    put4
2fa60 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2fa70 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2fa80 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2fa90 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  New);.  .    /* 
2faa0 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
2fab0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
2fac0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
2fad0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
2fae0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2faf0 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2fb00 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2fb10 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  BALANCE */..#if 
2fb20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  0./*.** This fun
2fb30 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
2fb40 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69  ontribute anythi
2fb50 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ng to the operat
2fb60 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a  ion of SQLite..*
2fb70 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65  * it is sometime
2fb80 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70  s activated temp
2fb90 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65  orarily while de
2fba0 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73  bugging code res
2fbb0 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72  ponsible .** for
2fbc0 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72   setting pointer
2fbd0 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  -map entries..*/
2fbe0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2fbf0 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d  apCheckPages(Mem
2fc00 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69  Page **apPage, i
2fc10 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
2fc20 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30   i, j;.  for(i=0
2fc30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  ; i<nPage; i++){
2fc40 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20  .    Pgno n;.   
2fc50 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61   u8 e;.    MemPa
2fc60 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61  ge *pPage = apPa
2fc70 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61  ge[i];.    BtSha
2fc80 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2fc90 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
2fca0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2fcb0 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   );..    for(j=0
2fcc0 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; j<pPage->nCell
2fcd0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65  ; j++){.      Ce
2fce0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
2fcf0 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a     u8 *z;.     .
2fd00 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65        z = findCe
2fd10 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20  ll(pPage, j);.  
2fd20 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
2fd30 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20  llPtr(pPage, z, 
2fd40 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66  &info);.      if
2fd50 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
2fd60 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2fd70 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65   ovfl = get4byte
2fd80 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  (&z[info.iOverfl
2fd90 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74  ow]);.        pt
2fda0 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66  rmapGet(pBt, ovf
2fdb0 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  l, &e, &n);.    
2fdc0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2fdd0 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2fde0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
2fdf0 31 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  1 );.      }.   
2fe00 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
2fe10 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50  eaf ){.        P
2fe20 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
2fe30 62 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  byte(z);.       
2fe40 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2fe50 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2fe60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fe70 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
2fe80 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  & e==PTRMAP_BTRE
2fe90 45 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  E );.      }.   
2fea0 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67   }.    if( !pPag
2feb0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2fec0 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65   Pgno child = ge
2fed0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2fee0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
2fef0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20  ffset+8]);.     
2ff00 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
2ff10 63 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a  child, &e, &n);.
2ff20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2ff30 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2ff40 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
2ff50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2ff60 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
2ff70 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
2ff80 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2ff90 6f 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  o copy the conte
2ffa0 6e 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65  nts of the b-tre
2ffb0 65 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a  e node stored .*
2ffc0 2a 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20  * on page pFrom 
2ffd0 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20  to page pTo. If 
2ffe0 70 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e  page pFrom was n
2fff0 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20  ot a leaf page, 
30000 74 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  then.** the poin
30010 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
30020 66 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70  for each child p
30030 61 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20  age are updated 
30040 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  so that the.** p
30050 61 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65  arent page store
30060 64 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  d in the pointer
30070 20 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f   map is page pTo
30080 2e 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61  . If pFrom conta
30090 69 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c  ined.** any cell
300a0 73 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  s with overflow 
300b0 70 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74  page pointers, t
300c0 68 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f  hen the correspo
300d0 6e 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a  nding pointer.**
300e0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65   map entries are
300f0 20 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f   also updated so
30100 20 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74   that the parent
30110 20 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54   page is page pT
30120 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f  o..**.** If pFro
30130 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63  m is currently c
30140 61 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72  arrying any over
30150 66 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72  flow cells (entr
30160 69 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65  ies in the.** Me
30170 6d 50 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72  mPage.aOvfl[] ar
30180 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e  ray), they are n
30190 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f  ot copied to pTo
301a0 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  . .**.** Before 
301b0 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20  returning, page 
301c0 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c  pTo is reinitial
301d0 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65  ized using btree
301e0 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
301f0 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  * The performanc
30200 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
30210 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63  on is not critic
30220 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  al. It is only u
30230 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62  sed by .** the b
30240 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
30250 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64  () and balance_d
30260 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72  eeper() procedur
30270 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a  es, neither of.*
30280 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c  * which are call
30290 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e  ed often under n
302a0 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e  ormal circumstan
302b0 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
302c0 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  oid copyNodeCont
302d0 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72  ent(MemPage *pFr
302e0 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  om, MemPage *pTo
302f0 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
30300 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
30310 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68  E_OK ){.    BtSh
30320 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74  ared * const pBt
30330 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20   = pFrom->pBt;. 
30340 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46     u8 * const aF
30350 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61  rom = pFrom->aDa
30360 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  ta;.    u8 * con
30370 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44  st aTo = pTo->aD
30380 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  ata;.    int con
30390 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46  st iFromHdr = pF
303a0 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  rom->hdrOffset;.
303b0 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54      int const iT
303c0 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67  oHdr = ((pTo->pg
303d0 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30  no==1) ? 100 : 0
303e0 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  );.    int rc;. 
303f0 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20     int iData;.  
30400 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  .  .    assert( 
30410 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
30420 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
30430 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64  om->nFree>=iToHd
30440 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
30450 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
30460 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d  [iFromHdr+5]) <=
30470 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
30480 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20  eSize );.  .    
30490 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
304a0 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
304b0 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
304c0 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
304d0 20 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32      iData = get2
304e0 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
304f0 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65  mHdr+5]);.    me
30500 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d  mcpy(&aTo[iData]
30510 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c  , &aFrom[iData],
30520 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
30530 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d  -iData);.    mem
30540 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
30550 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
30560 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
30570 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
30580 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20  >nCell);.  .    
30590 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
305a0 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
305b0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
305c0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
305d0 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61  ucture.    ** ma
305e0 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
305f0 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
30600 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20  tion of pTo can 
30610 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e  actually fail un
30620 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c  der.    ** fairl
30630 79 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d  y obscure circum
30640 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68  stances, even th
30650 6f 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70  ough it is a cop
30660 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  y of initialized
30670 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46   .    ** page pF
30680 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rom..    */.    
30690 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  pTo->isInit = 0;
306a0 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
306b0 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20  nitPage(pTo);.  
306c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
306d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
306e0 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
306f0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
30700 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
30710 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
30720 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
30730 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
30740 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
30750 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f  for any b-tree o
30760 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
30770 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f   that pTo now co
30780 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
30790 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20  ers to..    */. 
307a0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
307b0 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  UUM ){.      *pR
307c0 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  C = setChildPtrm
307d0 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a  aps(pTo);.    }.
307e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
307f0 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
30800 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
30810 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
30820 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
30830 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
30840 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
30850 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
30860 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
30870 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
30880 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
30890 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
308a0 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
308b0 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
308c0 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
308d0 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65  .** page are use
308e0 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
308f0 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20  ng, though both 
30900 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
30910 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ome from one.** 
30920 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  side if the page
30930 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72   is the first or
30940 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
30950 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68  ts parent. If th
30960 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66  e page .** has f
30970 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c  ewer than 2 sibl
30980 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20  ings (something 
30990 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
309a0 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67  appen if the pag
309b0 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70  e.** is a root p
309c0 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f  age or a child o
309d0 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74  f a root page) t
309e0 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
309f0 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61  e siblings.** pa
30a00 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
30a10 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
30a20 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
30a30 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20  siblings of the 
30a40 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  page might be in
30a50 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
30a60 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20  ased by .** one 
30a70 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  or two in an eff
30a80 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
30a90 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
30aa0 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
30ab0 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
30ac0 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
30ad0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
30ae0 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
30af0 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
30b00 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
30b10 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
30b20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e  MemPage.aData[].
30b30 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
30b40 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
30b50 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69  is overfull. Thi
30b60 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
30b70 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73  s that all cells
30b80 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f   allocated.** to
30b90 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
30ba0 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69  s siblings fit i
30bb0 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  nto MemPage.aDat
30bc0 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72  a[] before retur
30bd0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ning..**.** In t
30be0 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
30bf0 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20  ancing the page 
30c00 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
30c10 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a  , cells may be.*
30c20 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
30c30 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
30c40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
30c50 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67  (pParent). Doing
30c60 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65   so.** may cause
30c70 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
30c80 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
30c90 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
30ca0 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70  . If this.** hap
30cb0 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20  pens, it is the 
30cc0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
30cd0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
30ce0 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65  invoke the corre
30cf0 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20  ct.** balancing 
30d00 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74  routine to fix t
30d10 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65  his problem (see
30d20 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
30d30 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20  outine). .**.** 
30d40 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
30d50 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
30d60 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
30d70 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
30d80 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
30d90 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66  ted state. So if
30da0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
30db0 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
30dc0 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
30dd0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
30de0 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75  * The third argu
30df0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
30e00 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63  ction, aOvflSpac
30e10 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
30e20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62  to a.** buffer b
30e30 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
30e40 64 20 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77  d one page. If w
30e50 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63  hile inserting c
30e60 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
30e70 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50  rent.** page (pP
30e80 61 72 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e  arent) the paren
30e90 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
30ea0 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75  verfull, this bu
30eb0 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20  ffer is.** used 
30ec0 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70 61 72  to store the par
30ed0 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63  ent's overflow c
30ee0 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68  ells. Because th
30ef0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65  is function inse
30f00 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d  rts.** a maximum
30f10 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65 72   of four divider
30f20 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20   cells into the 
30f30 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64  parent page, and
30f40 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
30f50 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73  size of a cell s
30f60 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20  tored within an 
30f70 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73  internal node is
30f80 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61   always less tha
30f90 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20  n 1/4.** of the 
30fa0 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61  page-size, the a
30fb0 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66  OvflSpace[] buff
30fc0 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
30fd0 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20   to be large.** 
30fe0 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f  enough for all o
30ff0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
31000 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61  *.** If aOvflSpa
31010 63 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e  ce is set to a n
31020 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ull pointer, thi
31030 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
31040 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  ns .** SQLITE_NO
31050 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  MEM..*/.static i
31060 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
31070 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ot(.  MemPage *p
31080 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
31090 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
310a0 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73  page of siblings
310b0 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20   being balanced 
310c0 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
310d0 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
310e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
310f0 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20 70   "the page" in p
31100 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a  Parent */.  u8 *
31110 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20  aOvflSpace,     
31120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
31130 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f  age-size bytes o
31140 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72 65  f space for pare
31150 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74  nt ovfl */.  int
31160 20 69 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20   isRoot         
31170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31180 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
31190 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a  is a root-page *
311a0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
311b0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
311c0 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
311d0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
311e0 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20  nt nCell = 0;   
311f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31200 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
31210 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
31220 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  int nMaxCells = 
31230 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
31240 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
31250 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  f apCell, szCell
31260 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e  , aFrom. */.  in
31270 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20  t nNew = 0;     
31280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
31290 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
312a0 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
312b0 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  t nOld;         
312c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
312d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
312e0 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e   apOld[] */.  in
312f0 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20  t i, j, k;      
31300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
31310 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
31320 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20   int nxDiv;     
31330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31340 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c   Next divider sl
31350 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ot in pParent->a
31360 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
31370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
31380 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31390 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
313a0 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74   u16 leafCorrect
313b0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ion;          /*
313c0 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
313d0 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74   leaf.  0 if not
313e0 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61   */.  int leafDa
313f0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
31400 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50     /* True if pP
31410 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66  age is a leaf of
31420 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65   a LEAFDATA tree
31430 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
31440 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
31450 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70     /* Bytes in p
31460 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20  Page beyond the 
31470 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
31480 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20  pageFlags;      
31490 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
314a0 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74  e of pPage->aDat
314b0 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75  a[0] */.  int su
314c0 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20  btotal;         
314d0 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74         /* Subtot
314e0 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63  al of bytes in c
314f0 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65  ells on one page
31500 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65   */.  int iSpace
31510 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  1 = 0;          
31520 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
31530 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63  ed byte of aSpac
31540 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  e1[] */.  int iO
31550 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20  vflSpace = 0;   
31560 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
31570 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
31580 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20  OvflSpace[] */. 
31590 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20   int szScratch; 
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
315b0 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68   Size of scratch
315c0 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65   memory requeste
315d0 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  d */.  MemPage *
315e0 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20  apOld[NB];      
315f0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
31600 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69   up to two sibli
31610 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ngs */.  MemPage
31620 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
31630 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
31640 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
31650 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
31660 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
31670 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
31680 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
31690 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
316a0 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75  balancing */.  u
316b0 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20  8 *pRight;      
316c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
316d0 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e  ocation in paren
316e0 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69  t of right-sibli
316f0 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ng pointer */.  
31700 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b  u8 *apDiv[NB-1];
31710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31720 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
31730 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
31740 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
31750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
31760 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
31770 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
31780 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
31790 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
317a0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
317b0 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
317c0 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
317d0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
317e0 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
317f0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
31800 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
31810 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
31820 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
31830 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
31840 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
31850 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
31860 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20    u8 *aSpace1;  
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31880 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69  * Space for copi
31890 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63  es of dividers c
318a0 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ells */.  Pgno p
318b0 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
318c0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76         /* Temp v
318d0 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61  ar to store a pa
318e0 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a  ge number in */.
318f0 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74  .  pBt = pParent
31900 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
31910 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
31920 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
31930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
31940 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31950 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
31960 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30  bPage) );..#if 0
31970 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
31980 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25  CE: begin page %
31990 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22  d child of %d\n"
319a0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
319b0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a  Parent->pgno));.
319c0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20  #endif..  /* At 
319d0 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65  this point pPare
319e0 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d  nt may have at m
319f0 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77  ost one overflow
31a00 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20   cell. And if.  
31a10 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  ** this overflow
31a20 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74   cell is present
31a30 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65  , it must be the
31a40 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a   cell with .  **
31a50 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64   index iParentId
31a60 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f  x. This scenario
31a70 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65   comes about whe
31a80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
31a90 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28    ** is called (
31aa0 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d  indirectly) from
31ab0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
31ac0 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ete()..  */.  as
31ad0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e  sert( pParent->n
31ae0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70  Overflow==0 || p
31af0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31b00 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  w==1 );.  assert
31b10 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  ( pParent->nOver
31b20 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65  flow==0 || pPare
31b30 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  nt->aOvfl[0].idx
31b40 3d 3d 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a  ==iParentIdx );.
31b50 0a 20 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61  .  if( !aOvflSpa
31b60 63 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ce ){.    return
31b70 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
31b80 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68   }..  /* Find th
31b90 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
31ba0 74 6f 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f  to balance. Also
31bb0 20 6c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   locate the cell
31bc0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20  s in pParent .  
31bd0 2a 2a 20 74 68 61 74 20 64 69 76 69 64 65 20 74  ** that divide t
31be0 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20  he siblings. An 
31bf0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
31c00 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
31c10 6e 67 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74  ngs on .  ** eit
31c20 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
31c30 65 2e 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  e. More siblings
31c40 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
31c50 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
31c60 72 2c 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72  r, .  ** if ther
31c70 65 20 61 72 65 20 66 65 77 65 72 20 74 68 61 6e  e are fewer than
31c80 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
31c90 74 68 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20  the other side. 
31ca0 49 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20  If pParent.  ** 
31cb0 68 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20  has NB or fewer 
31cc0 63 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c  children then al
31cd0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50  l children of pP
31ce0 61 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e  arent are taken.
31cf0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
31d00 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70  s loop also drop
31d10 73 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  s the divider ce
31d20 6c 6c 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72  lls from the par
31d30 65 6e 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20  ent page. This. 
31d40 20 2a 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d   ** way, the rem
31d50 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75  ainder of the fu
31d60 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
31d70 68 61 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74  have to deal wit
31d80 68 20 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66  h any.  ** overf
31d90 6c 6f 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65  low cells in the
31da0 20 70 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69   parent page, si
31db0 6e 63 65 20 69 66 20 61 6e 79 20 65 78 69 73 74  nce if any exist
31dc0 65 64 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a  ed they will.  *
31dd0 2a 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  * have already b
31de0 65 65 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a  een removed..  *
31df0 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d  /.  i = pParent-
31e00 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61  >nOverflow + pPa
31e10 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69  rent->nCell;.  i
31e20 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78  f( i<2 ){.    nx
31e30 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c  Div = 0;.    nOl
31e40 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65  d = i+1;.  }else
31e50 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a  {.    nOld = 3;.
31e60 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49      if( iParentI
31e70 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  dx==0 ){        
31e80 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20           .      
31e90 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d  nxDiv = 0;.    }
31ea0 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74  else if( iParent
31eb0 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  Idx==i ){.      
31ec0 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20  nxDiv = i-2;.   
31ed0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78   }else{.      nx
31ee0 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78  Div = iParentIdx
31ef0 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  -1;.    }.    i 
31f00 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  = 2;.  }.  if( (
31f10 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
31f20 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61  >nOverflow)==pPa
31f30 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
31f40 20 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61     pRight = &pPa
31f50 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
31f60 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
31f70 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
31f80 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c  pRight = findCel
31f90 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
31fa0 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
31fb0 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67  rflow);.  }.  pg
31fc0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52  no = get4byte(pR
31fd0 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  ight);.  while( 
31fe0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  1 ){.    rc = ge
31ff0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
32000 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69  , pgno, &apOld[i
32010 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
32020 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61  {.      memset(a
32030 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73  pOld, 0, (i+1)*s
32040 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29  izeof(MemPage*))
32050 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c  ;.      goto bal
32060 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
32070 20 20 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c    }.    nMaxCell
32080 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
32090 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
320a0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20  >nOverflow;.    
320b0 69 66 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62  if( (i--)==0 ) b
320c0 72 65 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69  reak;..    if( i
320d0 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d  +nxDiv==pParent-
320e0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26  >aOvfl[0].idx &&
320f0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
32100 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44  low ){.      apD
32110 69 76 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d  iv[i] = pParent-
32120 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
32130 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
32140 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
32150 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
32160 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
32170 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
32180 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
32190 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
321a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
321b0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
321c0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
321d0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
321e0 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  nOverflow);.    
321f0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
32200 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
32210 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
32220 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
32230 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20  t, apDiv[i]);.. 
32240 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65       /* Drop the
32250 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70   cell from the p
32260 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69  arent page. apDi
32270 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74  v[i] still point
32280 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
32290 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68  e cell within th
322a0 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74  e parent, even t
322b0 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65  hough it has bee
322c0 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20  n dropped..     
322d0 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65   ** This is safe
322e0 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e   because droppin
322f0 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76  g a cell only ov
32300 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72  erwrites the fir
32310 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
32320 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e   bytes of it, an
32330 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
32340 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68  does not need th
32350 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
32360 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74   four bytes of t
32370 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e  he divider cell.
32380 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20   So the pointer 
32390 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20  is safe to use. 
323a0 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e       ** later on
323b0 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  .  .      **.   
323c0 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66     ** But not if
323d0 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75 72   we are in secur
323e0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
323f0 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
32400 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  mode,.      ** t
32410 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f  he dropCell() ro
32420 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77  utine will overw
32430 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  rite the entire 
32440 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73  cell with zeroes
32450 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68  ..      ** In th
32460 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61  is case, tempora
32470 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65  rily copy the ce
32480 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66  ll into the aOvf
32490 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a  lSpace[].      *
324a0 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c  * buffer. It wil
324b0 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  l be copied out 
324c0 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73  again as soon as
324d0 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75   the aSpace[] bu
324e0 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  ffer.      ** is
324f0 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a   allocated.  */.
32500 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 73        if( pBt->s
32510 65 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20  ecureDelete ){. 
32520 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b         int iOff;
32530 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  ..        iOff =
32540 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
32550 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53  NT(apDiv[i]) - S
32560 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
32570 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  (pParent->aData)
32580 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
32590 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69  Off+szNew[i])>(i
325a0 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
325b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
325c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
325d0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
325e0 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
325f0 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
32600 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
32610 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
32620 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
32630 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32640 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
32650 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c  OvflSpace[iOff],
32660 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77   apDiv[i], szNew
32670 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
32680 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66  apDiv[i] = &aOvf
32690 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d  lSpace[apDiv[i]-
326a0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b  pParent->aData];
326b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
326c0 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c   }.      dropCel
326d0 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
326e0 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
326f0 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c  rflow, szNew[i],
32700 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
32710 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
32720 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
32730 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74   of 4 in order t
32740 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
32750 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
32760 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
32770 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33  = (nMaxCells + 3
32780 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~3;..  /*.  **
32790 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
327a0 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
327b0 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d  tures.  */.  k =
327c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b   pBt->pageSize +
327d0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
327e0 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63  emPage));.  szSc
327f0 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
32800 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
32810 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
32820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
32830 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
32840 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
32850 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
32860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
32870 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Cell */.     + p
32880 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20  Bt->pageSize    
32890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
328b0 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20  pace1 */.     + 
328c0 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  k*nOld;         
328d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
328f0 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f  age copies (apCo
32900 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  py) */.  apCell 
32910 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
32920 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
32930 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
32940 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
32950 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
32960 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
32970 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
32980 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
32990 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
329a0 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28  ];.  aSpace1 = (
329b0 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
329c0 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
329d0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
329e0 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20  GNMENT(aSpace1) 
329f0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f  );..  /*.  ** Lo
32a00 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
32a10 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
32a20 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
32a30 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
32a40 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
32a50 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
32a60 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
32a70 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
32a80 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
32a90 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
32aa0 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  rom aSpace1[] an
32ab0 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65  d remove the the
32ac0 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20   divider Cells. 
32ad0 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74   ** from pParent
32ae0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
32af0 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
32b00 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74  on leaf pages, t
32b10 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f  hen the child po
32b20 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20  inters of the.  
32b30 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ** divider cells
32b40 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66 72   are stripped fr
32b50 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66  om the cells bef
32b60 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f 70  ore they are cop
32b70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53  ied.  ** into aS
32b80 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69  pace1[].  In thi
32b90 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73  s way, all cells
32ba0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65   in apCell[] are
32bb0 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68   without.  ** ch
32bc0 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49  ild pointers.  I
32bd0 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e  f siblings are n
32be0 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20  ot leaves, then 
32bf0 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a  all cell in.  **
32c00 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64   apCell[] includ
32c10 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
32c20 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61  .  Either way, a
32c30 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
32c40 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c  ll[].  ** are al
32c50 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c  ike..  **.  ** l
32c60 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20  eafCorrection:  
32c70 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
32c80 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61 67  leaf.  0 if pPag
32c90 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e  e is not a leaf.
32ca0 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66  .  **       leaf
32cb0 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61 67  Data:  1 if pPag
32cc0 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61  e holds key+data
32cd0 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c   and pParent hol
32ce0 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20  ds only keys..  
32cf0 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74  */.  leafCorrect
32d00 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ion = apOld[0]->
32d10 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61  leaf*4;.  leafDa
32d20 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68  ta = apOld[0]->h
32d30 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d  asData;.  for(i=
32d40 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
32d50 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a  .    int limit;.
32d60 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f      .    /* Befo
32d70 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  re doing anythin
32d80 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63  g else, take a c
32d90 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68 20  opy of the i'th 
32da0 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67  original sibling
32db0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74  .    ** The rest
32dc0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
32dd0 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20  n will use data 
32de0 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20  from the copies 
32df0 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68  rather.    ** th
32e00 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  at the original 
32e10 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20  pages since the 
32e20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77  original pages w
32e30 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20  ill be in the.  
32e40 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20    ** process of 
32e50 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65  being overwritte
32e60 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  n.  */.    MemPa
32e70 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70  ge *pOld = apCop
32e80 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a  y[i] = (MemPage*
32e90 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70  )&aSpace1[pBt->p
32ea0 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a  ageSize + k*i];.
32eb0 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c      memcpy(pOld,
32ec0 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
32ed0 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
32ee0 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28   pOld->aData = (
32ef0 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a  void*)&pOld[1];.
32f00 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d      memcpy(pOld-
32f10 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
32f20 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
32f30 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69  geSize);..    li
32f40 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  mit = pOld->nCel
32f50 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  l+pOld->nOverflo
32f60 77 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 2d  w;.    if( pOld-
32f70 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a  >nOverflow>0 ){.
32f80 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
32f90 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20  <limit; j++){.  
32fa0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
32fb0 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
32fc0 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
32fd0 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
32fe0 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
32ff0 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
33000 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
33010 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
33020 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
33030 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
33040 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
33050 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 44 61 74  {.      u8 *aDat
33060 61 20 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b  a = pOld->aData;
33070 0a 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 50  .      u16 maskP
33080 61 67 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b  age = pOld->mask
33090 50 61 67 65 3b 0a 20 20 20 20 20 20 75 31 36 20  Page;.      u16 
330a0 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c  cellOffset = pOl
330b0 64 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  d->cellOffset;. 
330c0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
330d0 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
330e0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
330f0 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
33100 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e          apCell[n
33110 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  Cell] = findCell
33120 76 32 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61  v2(aData, maskPa
33130 67 65 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20  ge, cellOffset, 
33140 6a 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65  j);.        szCe
33150 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
33160 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
33170 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20  Cell[nCell]);.  
33180 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
33190 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 20       }.    }    
331a0 20 20 20 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f     .    if( i<nO
331b0 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74  ld-1 && !leafDat
331c0 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a  a){.      u16 sz
331d0 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d   = (u16)szNew[i]
331e0 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
331f0 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
33200 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
33210 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
33220 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
33230 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
33240 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20  ace1[iSpace1];. 
33250 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
33260 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
33270 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f  ( sz<=pBt->maxLo
33280 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20  cal+23 );.      
33290 61 73 73 65 72 74 28 20 69 53 70 61 63 65 31 20  assert( iSpace1 
332a0 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67  <= (int)pBt->pag
332b0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d  eSize );.      m
332c0 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44  emcpy(pTemp, apD
332d0 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  iv[i], sz);.    
332e0 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
332f0 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
33300 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73  ection;.      as
33310 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
33320 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43  tion==0 || leafC
33330 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
33340 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
33350 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65  ll] = szCell[nCe
33360 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63  ll] - leafCorrec
33370 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20  tion;.      if( 
33380 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
33390 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
333a0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
333b0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
333c0 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  rt( pOld->hdrOff
333d0 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  set==0 );.      
333e0 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70    /* The right p
333f0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68  ointer of the ch
33400 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65  ild page pOld be
33410 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20  comes the left. 
33420 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
33430 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
33440 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
33450 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
33460 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
33470 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[8], 4);.    
33480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33490 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
334a0 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
334b0 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
334c0 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20  [nCell]<4 ){.   
334d0 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
334e0 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73   allow any cells
334f0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20   smaller than 4 
33500 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  bytes. */.      
33510 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
33520 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d  ] = 4;.        }
33530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
33540 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Cell++;.    }.  
33550 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67  }..  /*.  ** Fig
33560 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62  ure out the numb
33570 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64  er of pages need
33580 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e  ed to hold all n
33590 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a  Cell cells..  **
335a0 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62   Store this numb
335b0 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f  er in "k".  Also
335c0 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d   compute szNew[]
335d0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74 6f   which is the to
335e0 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66  tal.  ** size of
335f0 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68   all cells on th
33600 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20  e i-th page and 
33610 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69  cntNew[] which i
33620 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  s the index.  **
33630 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20   in apCell[] of 
33640 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69  the cell that di
33650 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72 6f  vides page i fro
33660 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20  m page i+1.  .  
33670 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f  ** cntNew[k] sho
33680 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e  uld equal nCell.
33690 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65  .  **.  ** Value
336a0 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
336b0 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20  is block:.  **. 
336c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a   **           k:
336d0 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   The total numbe
336e0 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67  r of sibling pag
336f0 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77  es.  **    szNew
33700 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64  [i]: Spaced used
33710 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62   on the i-th sib
33720 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
33730 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64    cntNew[i]: Ind
33740 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ex in apCell[] a
33750 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20  nd szCell[] for 
33760 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74  the first cell t
33770 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  o.  **          
33780 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f 66      the right of
33790 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
337a0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61  g page..  ** usa
337b0 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72  bleSpace: Number
337c0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
337d0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ce available on 
337e0 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20  each sibling..  
337f0 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c  ** .  */.  usabl
33800 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73  eSpace = pBt->us
33810 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20  ableSize - 12 + 
33820 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
33830 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b    for(subtotal=k
33840 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  =i=0; i<nCell; i
33850 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
33860 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   i<nMaxCells );.
33870 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20      subtotal += 
33880 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20  szCell[i] + 2;. 
33890 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20     if( subtotal 
338a0 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b  > usableSpace ){
338b0 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20  .      szNew[k] 
338c0 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43  = subtotal - szC
338d0 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e  ell[i];.      cn
338e0 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20  tNew[k] = i;.   
338f0 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20     if( leafData 
33900 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
33910 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20  subtotal = 0;.  
33920 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69      k++;.      i
33930 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20  f( k>NB+1 ){ rc 
33940 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
33950 5f 42 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  _BKPT; goto bala
33960 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
33970 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
33980 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
33990 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
339a0 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
339b0 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
339c0 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
339d0 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
339e0 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
339f0 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
33a00 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
33a10 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
33a20 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
33a30 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
33a40 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
33a50 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
33a60 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
33a70 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
33a80 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
33a90 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
33aa0 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
33ab0 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
33ac0 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
33ad0 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
33ae0 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
33af0 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
33b00 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
33b10 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
33b20 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
33b30 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
33b40 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
33b50 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
33b60 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
33b70 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
33b80 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
33b90 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
33ba0 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
33bb0 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
33bc0 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
33bd0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
33be0 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
33bf0 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
33c00 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
33c10 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
33c20 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
33c30 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
33c40 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
33c50 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
33c60 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
33c70 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
33c80 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
33c90 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
33ca0 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
33cb0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
33cc0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
33cd0 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
33ce0 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
33cf0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
33d00 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
33d10 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
33d20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
33d30 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
33d40 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
33d50 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
33d60 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
33d70 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
33d80 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
33d90 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
33da0 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
33db0 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
33dc0 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
33dd0 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
33de0 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
33df0 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
33e00 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
33e10 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
33e20 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
33e30 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
33e40 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
33e50 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
33e60 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
33e70 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
33e80 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
33e90 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50  new[0])>0) or pP
33ea0 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69  age is.  ** a vi
33eb0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
33ec0 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
33ed0 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
33ee0 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
33ef0 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
33f00 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
33f10 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
33f20 74 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a  t page..  **.  *
33f30 2a 20 55 50 44 41 54 45 3a 20 20 54 68 65 20 61  * UPDATE:  The a
33f40 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 69 73  ssert() below is
33f50 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
33f60 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74   true if the dat
33f70 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 20  abase.  ** file 
33f80 69 73 20 63 6f 72 72 75 70 74 2e 20 20 54 68 65  is corrupt.  The
33f90 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
33fa0 20 62 65 20 64 65 74 65 63 74 65 64 20 61 6e 64   be detected and
33fb0 20 72 65 70 6f 72 74 65 64 20 6c 61 74 65 72 0a   reported later.
33fc0 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 70 72 6f    ** in this pro
33fd0 63 65 64 75 72 65 20 73 6f 20 74 68 65 72 65 20  cedure so there 
33fe0 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 61 63  is no need to ac
33ff0 74 20 75 70 6f 6e 20 69 74 20 6e 6f 77 2e 0a 20  t upon it now.. 
34000 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
34010 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
34020 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
34030 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
34040 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 23 65  >nCell==0) );.#e
34050 6e 64 69 66 0a 0a 20 20 54 52 41 43 45 28 28 22  ndif..  TRACE(("
34060 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64  BALANCE: old: %d
34070 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61   %d %d  ",.    a
34080 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a  pOld[0]->pgno, .
34090 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70      nOld>=2 ? ap
340a0 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30  Old[1]->pgno : 0
340b0 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20  ,.    nOld>=3 ? 
340c0 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a  apOld[2]->pgno :
340d0 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20   0.  ));..  /*. 
340e0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e   ** Allocate k n
340f0 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65  ew pages.  Reuse
34100 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65   old pages where
34110 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a   possible..  */.
34120 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e    if( apOld[0]->
34130 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72  pgno<=1 ){.    r
34140 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
34150 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
34160 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
34170 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c 61  p;.  }.  pageFla
34180 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 61  gs = apOld[0]->a
34190 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69  Data[0];.  for(i
341a0 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
341b0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
341c0 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  ;.    if( i<nOld
341d0 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d   ){.      pNew =
341e0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c   apNew[i] = apOl
341f0 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c  d[i];.      apOl
34200 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  d[i] = 0;.      
34210 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34220 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62  rWrite(pNew->pDb
34230 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65  Page);.      nNe
34240 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72  w++;.      if( r
34250 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
34260 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65  _cleanup;.    }e
34270 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
34280 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( i>0 );.      
34290 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
342a0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
342b0 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c 20  w, &pgno, pgno, 
342c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
342d0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
342e0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
342f0 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a  pNew[i] = pNew;.
34300 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a 20        nNew++;.. 
34310 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
34320 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
34330 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69  y for the new si
34340 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20  bling page. */. 
34350 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
34360 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
34370 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
34380 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
34390 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
343a0 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
343b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
343c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
343d0 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
343e0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
343f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
34400 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72    }.  }..  /* Fr
34410 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73  ee any old pages
34420 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72   that were not r
34430 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61 67  eused as new pag
34440 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65  es..  */.  while
34450 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
34460 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
34470 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  ], &rc);.    if(
34480 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
34490 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
344a0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c  releasePage(apOl
344b0 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64  d[i]);.    apOld
344c0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b  [i] = 0;.    i++
344d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
344e0 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61 67   Put the new pag
344f0 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  es in accending 
34500 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c  order.  This hel
34510 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20  ps to.  ** keep 
34520 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 64  entries in the d
34530 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  isk file in orde
34540 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e  r so that a scan
34550 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  .  ** of the tab
34560 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73  le is a linear s
34570 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20  can through the 
34580 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a  file.  That.  **
34590 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74   in turn helps t
345a0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
345b0 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70  tem to deliver p
345c0 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74  ages.  ** from t
345d0 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70  he disk more rap
345e0 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  idly..  **.  ** 
345f0 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74  An O(n^2) insert
34600 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74  ion sort algorit
34610 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74 20  hm is used, but 
34620 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20  since.  ** n is 
34630 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
34640 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73  NB (a small cons
34650 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75  tant), that shou
34660 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61  ld.  ** not be a
34670 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20   problem..  **. 
34680 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20   ** When NB==3, 
34690 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a  this one optimiz
346a0 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20  ation makes the 
346b0 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62  database.  ** ab
346c0 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20 66  out 25% faster f
346d0 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69  or large inserti
346e0 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e  ons and deletion
346f0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
34700 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a  0; i<k-1; i++){.
34710 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 61      int minV = a
34720 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[i]->pgno;. 
34730 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b     int minI = i;
34740 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20  .    for(j=i+1; 
34750 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  j<k; j++){.     
34760 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70   if( apNew[j]->p
34770 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69  gno<(unsigned)mi
34780 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69  nV ){.        mi
34790 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  nI = j;.        
347a0 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d 2d  minV = apNew[j]-
347b0 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  >pgno;.      }. 
347c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
347d0 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  I>i ){.      Mem
347e0 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20  Page *pT;.      
347f0 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20  pT = apNew[i];. 
34800 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
34810 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
34820 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
34830 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
34840 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64   TRACE(("new: %d
34850 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
34860 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
34870 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30  \n",.    apNew[0
34880 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30  ]->pgno, szNew[0
34890 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f  ],.    nNew>=2 ?
348a0 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20   apNew[1]->pgno 
348b0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73  : 0, nNew>=2 ? s
348c0 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20  zNew[1] : 0,.   
348d0 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77   nNew>=3 ? apNew
348e0 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [2]->pgno : 0, n
348f0 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32  New>=3 ? szNew[2
34900 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
34910 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70  =4 ? apNew[3]->p
34920 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34  gno : 0, nNew>=4
34930 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c   ? szNew[3] : 0,
34940 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61  .    nNew>=5 ? a
34950 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[4]->pgno : 
34960 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e  0, nNew>=5 ? szN
34970 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20  ew[4] : 0));..  
34980 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
34990 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
349a0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
349b0 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  ) );.  put4byte(
349c0 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e  pRight, apNew[nN
349d0 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  ew-1]->pgno);.. 
349e0 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
349f0 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
34a00 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
34a10 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
34a20 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
34a30 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
34a40 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
34a50 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
34a60 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
34a70 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
34a80 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
34a90 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
34aa0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
34ab0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
34ac0 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
34ad0 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
34ae0 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
34af0 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73  (pNew, pageFlags
34b00 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
34b10 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
34b20 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
34b30 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
34b40 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
34b50 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
34b60 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
34b70 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
34b80 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
34b90 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20  rflow==0 );..   
34ba0 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a   j = cntNew[i];.
34bb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
34bc0 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65  ibling page asse
34bd0 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20  mbled above was 
34be0 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  not the right-mo
34bf0 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20  st sibling,.    
34c00 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69  ** insert a divi
34c10 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68  der cell into th
34c20 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
34c30 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
34c40 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d  ( i<nNew-1 || j=
34c50 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66  =nCell );.    if
34c60 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ( j<nCell ){.   
34c70 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
34c80 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
34c90 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
34ca0 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
34cb0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
34cc0 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
34cd0 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
34ce0 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
34cf0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
34d00 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53   pTemp = &aOvflS
34d10 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d  pace[iOvflSpace]
34d20 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65  ;.      if( !pNe
34d30 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  w->leaf ){.     
34d40 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d     memcpy(&pNew-
34d50 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c  >aData[8], pCell
34d60 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 4);.      }els
34d70 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29  e if( leafData )
34d80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
34d90 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65  the tree is a le
34da0 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e  af-data tree, an
34db0 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  d the siblings a
34dc0 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20  re leaves, .    
34dd0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72      ** then ther
34de0 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20  e is no divider 
34df0 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  cell in apCell[]
34e00 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64  . Instead, the d
34e10 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20  ivider .        
34e20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73  ** cell consists
34e30 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
34e40 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68  key for the righ
34e50 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a  t-most cell of .
34e60 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
34e70 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65  ibling-page asse
34e80 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79  mbled above only
34e90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34ea0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
34eb0 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b  fo;.        j--;
34ec0 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50 61  .        btreePa
34ed0 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c  rseCellPtr(pNew,
34ee0 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66   apCell[j], &inf
34ef0 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  o);.        pCel
34f00 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20  l = pTemp;.     
34f10 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74 56     sz = 4 + putV
34f20 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c  arint(&pCell[4],
34f30 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 20   info.nKey);.   
34f40 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a       pTemp = 0;.
34f50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34f60 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b       pCell -= 4;
34f70 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63  .        /* Obsc
34f80 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e  ure case for non
34f90 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73  -leaf-data trees
34fa0 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74  : If the cell at
34fb0 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20   pCell was.     
34fc0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79     ** previously
34fd0 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61   stored on a lea
34fe0 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20  f node, and its 
34ff0 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61  reported size wa
35000 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  s 4.        ** b
35010 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61  ytes, then it ma
35020 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d  y actually be sm
35030 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20  aller than this 
35040 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65  .        ** (see
35050 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
35060 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73  tr(), 4 bytes is
35070 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a   the minimum siz
35080 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
35090 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69  any cell). But i
350a0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
350b0 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65  o pass the corre
350c0 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20  ct size to .    
350d0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c      ** insertCel
350e0 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20  l(), so reparse 
350f0 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20  the cell now..  
35100 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
35110 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
35120 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70  is can never hap
35130 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  pen in an SQLite
35140 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61   data file, as a
35150 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65  ll.        ** ce
35160 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74  lls are at least
35170 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c   4 bytes. It onl
35180 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74  y happens in b-t
35190 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20  rees used.      
351a0 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65    ** to evaluate
351b0 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e   "IN (SELECT ...
351c0 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63  )" and similar c
351d0 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20  lauses..        
351e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
351f0 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20  zCell[j]==4 ){. 
35200 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
35210 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
35220 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  4);.          sz
35230 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
35240 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a  Parent, pCell);.
35250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35260 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61  }.      iOvflSpa
35270 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ce += sz;.      
35280 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d  assert( sz<=pBt-
35290 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a  >maxLocal+23 );.
352a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 4f        assert( iO
352b0 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e 74  vflSpace <= (int
352c0 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  )pBt->pageSize )
352d0 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43 65  ;.      insertCe
352e0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
352f0 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54  v, pCell, sz, pT
35300 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  emp, pNew->pgno,
35310 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
35320 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
35330 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
35340 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73 73  eanup;.      ass
35350 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
35360 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
35370 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29  rent->pDbPage) )
35380 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  ;..      j++;.  
35390 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20      nxDiv++;.   
353a0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
353b0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
353c0 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
353d0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
353e0 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
353f0 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
35400 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
35410 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
35420 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
35430 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
35440 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
35450 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
35460 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   4);.  }..  if( 
35470 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65 6e  isRoot && pParen
35480 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 70  t->nCell==0 && p
35490 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
354a0 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t<=apNew[0]->nFr
354b0 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ee ){.    /* The
354c0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
354d0 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f 6e  e b-tree now con
354e0 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
354f0 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e 67  The only sibling
35500 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20  .    ** page is 
35510 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
35520 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20 43  of the parent. C
35530 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
35540 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   of the.    ** c
35550 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20 74  hild page into t
35560 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72 65  he parent, decre
35570 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61 6c  asing the overal
35580 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65 0a  l height of the.
35590 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73 74      ** b-tree st
355a0 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e 20  ructure by one. 
355b0 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62 65  This is describe
355c0 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e 63  d as the "balanc
355d0 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20 20  e-shallower".   
355e0 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74 68   ** sub-algorith
355f0 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d 65  m in some docume
35600 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 0a  ntation..    **.
35610 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
35620 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
35630 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63   database, the c
35640 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65 43  all to copyNodeC
35650 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a 2a  ontent() .    **
35660 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74 65   sets all pointe
35670 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
35680 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 64  rresponding to d
35690 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70 61  atabase image pa
356a0 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72 20  ges .    ** for 
356b0 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74 65  which the pointe
356c0 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74 68  r is stored with
356d0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 62  in the content b
356e0 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20 20  eing copied..   
356f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
35700 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65 6c  econd assert bel
35710 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61 74  ow verifies that
35720 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
35730 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64 0a  is defragmented.
35740 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74 20      ** (it must 
35750 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a 75  be, as it was ju
35760 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65 64  st reconstructed
35770 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65 50   using assembleP
35780 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20 20  age()). This.   
35790 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   ** is important
357a0 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   if the parent p
357b0 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
357c0 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  e page 1 of the 
357d0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
357e0 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 61  image.  */.    a
357f0 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20 29  ssert( nNew==1 )
35800 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 70  ;.    assert( ap
35810 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d 3d  New[0]->nFree ==
35820 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32 62   .        (get2b
35830 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e 61  yte(&apNew[0]->a
35840 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b 30  Data[5])-apNew[0
35850 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61 70  ]->cellOffset-ap
35860 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32 29  New[0]->nCell*2)
35870 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f 70   .    );.    cop
35880 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70 4e  yNodeContent(apN
35890 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c 20  ew[0], pParent, 
358a0 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50 61  &rc);.    freePa
358b0 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72 63  ge(apNew[0], &rc
358c0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49  );.  }else if( I
358d0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
358e0 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
358f0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
35900 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
35910 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
35920 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
35930 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
35940 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
35950 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
35960 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
35970 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
35980 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
35990 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
359a0 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
359b0 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
359c0 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
359d0 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
359e0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
359f0 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
35a00 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
35a10 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
35a20 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
35a30 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
35a40 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
35a50 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
35a60 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
35a70 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
35a80 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
35a90 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
35aa0 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
35ab0 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
35ac0 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
35ad0 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
35ae0 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
35af0 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
35b00 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
35b10 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
35b20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
35b30 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
35b40 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
35b50 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
35b60 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
35b70 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
35b80 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
35b90 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
35ba0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
35bb0 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
35bc0 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
35bd0 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
35be0 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
35bf0 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
35c00 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
35c10 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
35c20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
35c30 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
35c40 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
35c50 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
35c60 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
35c70 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
35c80 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
35c90 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
35ca0 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
35cb0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
35cc0 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
35cd0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
35ce0 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
35cf0 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
35d00 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
35d10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
35d20 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
35d30 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
35d40 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
35d50 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
35d60 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
35d70 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
35d80 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
35d90 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
35da0 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
35db0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
35dc0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
35dd0 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
35de0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
35df0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
35e00 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
35e10 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
35e20 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
35e30 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
35e40 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
35e50 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
35e60 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
35e70 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
35e80 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
35e90 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
35ea0 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
35eb0 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
35ec0 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
35ed0 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
35ee0 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
35ef0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
35f00 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
35f10 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
35f20 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
35f30 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
35f40 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
35f50 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
35f60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
35f70 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
35f80 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
35f90 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
35fa0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
35fb0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
35fc0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
35fd0 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
35fe0 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
35ff0 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
36000 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
36010 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
36020 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
36030 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
36040 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
36050 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
36060 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  idx : -1);.    j
36070 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
36080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36090 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
360a0 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
360b0 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
360c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
360d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
360e0 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
360f0 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
36100 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
36110 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
36120 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
36130 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
36140 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
36150 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
36160 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
36170 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
36180 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
36190 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
361a0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
361b0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
361c0 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
361d0 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
361e0 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
361f0 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
36200 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
36210 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
36220 73 65 72 74 28 20 6a 2b 31 20 3c 20 41 72 72 61  sert( j+1 < Arra
36230 79 53 69 7a 65 28 61 70 43 6f 70 79 29 20 29 3b  ySize(apCopy) );
36240 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20  .        pOld = 
36250 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20  apCopy[++j];.   
36260 20 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20       iNextOld = 
36270 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
36280 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f  pOld->nCell + pO
36290 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
362a0 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
362b0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
362c0 20 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f          nOverflo
362d0 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
362e0 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  low;.          i
362f0 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21  Overflow = i + !
36300 6c 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d  leafData + pOld-
36310 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20  >aOvfl[0].idx;. 
36320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36330 20 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65   isDivider = !le
36340 61 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20  afData;  .      
36350 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
36360 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69  nOverflow>0 || i
36370 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20  Overflow<i );.  
36380 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
36390 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<2 || pOld->
363a0 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[0].idx==pO
363b0 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78  ld->aOvfl[1].idx
363c0 2d 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  -1);.      asser
363d0 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c  t(nOverflow<3 ||
363e0 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e   pOld->aOvfl[1].
363f0 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c  idx==pOld->aOvfl
36400 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20  [2].idx-1);.    
36410 20 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c    if( i==iOverfl
36420 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73  ow ){.        is
36430 44 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20  Divider = 1;.   
36440 20 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65       if( (--nOve
36450 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20  rflow)>0 ){.    
36460 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b        iOverflow+
36470 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
36480 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
36490 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a  i==cntNew[k] ){.
364a0 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20          /* Cell 
364b0 69 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d  i is the cell im
364c0 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
364d0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ing the last cel
364e0 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20  l on new.       
364f0 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65   ** sibling page
36500 20 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69   k. If the sibli
36510 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66  ngs are not leaf
36520 20 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20   pages of an.   
36530 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62       ** intkey b
36540 2d 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c  -tree, then cell
36550 20 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20   i is a divider 
36560 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20  cell.  */.      
36570 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b    pNew = apNew[+
36580 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +k];.        if(
36590 20 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e   !leafData ) con
365a0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
365b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
365c0 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Old );.      ass
365d0 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a  ert( k<nNew );..
365e0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
365f0 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61  cell was origina
36600 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c  lly divider cell
36610 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77   (and is not now
36620 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e  ) or.      ** an
36630 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20   overflow cell, 
36640 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77  or if the cell w
36650 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20  as located on a 
36660 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e  different siblin
36670 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20  g.      ** page 
36680 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e  before the balan
36690 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70  cing, then the p
366a0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
366b0 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  es associated.  
366c0 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20      ** with any 
366d0 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
366e0 77 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20  w pages need to 
366f0 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a  be updated.  */.
36700 20 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69        if( isDivi
36710 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e  der || pOld->pgn
36720 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
36730 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65  .        if( !le
36740 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a  afCorrection ){.
36750 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
36760 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74  Put(pBt, get4byt
36770 65 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54  e(apCell[i]), PT
36780 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
36790 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  ->pgno, &rc);.  
367a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
367b0 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e  if( szCell[i]>pN
367c0 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
367d0 20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70            ptrmap
367e0 50 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c  PutOvflPtr(pNew,
367f0 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29   apCell[i], &rc)
36800 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36810 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
36820 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
36830 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  on ){.      for(
36840 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
36850 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b  ){.        u32 k
36860 65 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ey = get4byte(&a
36870 70 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38  pNew[i]->aData[8
36880 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
36890 61 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20  apPut(pBt, key, 
368a0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
368b0 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72  New[i]->pgno, &r
368c0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
368d0 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20  }..#if 0.    /* 
368e0 54 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50  The ptrmapCheckP
368f0 61 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20  ages() contains 
36900 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
36910 6e 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20  nts that verify 
36920 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20  that.    ** all 
36930 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
36940 73 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63  s are set correc
36950 74 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c  tly. This is hel
36960 70 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20  pful while .    
36970 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68  ** debugging. Th
36980 69 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69  is is usually di
36990 73 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61  sabled because a
369a0 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
369b0 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75  e may.    ** cau
369c0 73 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  se an assert() s
369d0 74 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c  tatement to fail
369e0 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70  .  */.    ptrmap
369f0 43 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77  CheckPages(apNew
36a00 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72  , nNew);.    ptr
36a10 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70  mapCheckPages(&p
36a20 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64  Parent, 1);.#end
36a30 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  if.  }..  assert
36a40 28 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69  ( pParent->isIni
36a50 74 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  t );.  TRACE(("B
36a60 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
36a70 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20  : old=%d new=%d 
36a80 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  cells=%d\n",.   
36a90 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65         nOld, nNe
36aa0 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f  w, nCell));..  /
36ab0 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62  *.  ** Cleanup b
36ac0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
36ad0 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c  .  */.balance_cl
36ae0 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33  eanup:.  sqlite3
36af0 53 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65  ScratchFree(apCe
36b00 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll);.  for(i=0; 
36b10 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
36b20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
36b30 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66  Old[i]);.  }.  f
36b40 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20  or(i=0; i<nNew; 
36b50 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
36b60 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b  ePage(apNew[i]);
36b70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
36b80 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
36b90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
36ba0 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f  lled when the ro
36bb0 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
36bc0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
36bd0 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61  .** overfull (ha
36be0 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
36bf0 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a  erflow pages)..*
36c00 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64  *.** A new child
36c10 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74   page is allocat
36c20 65 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ed and the conte
36c30 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65  nts of the curre
36c40 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c  nt root.** page,
36c50 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66   including overf
36c60 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63  low cells, are c
36c70 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63  opied into the c
36c80 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a  hild. The root.*
36c90 2a 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f  * page is then o
36ca0 76 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61  verwritten to ma
36cb0 6b 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70  ke it an empty p
36cc0 61 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67  age with the rig
36cd0 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69  ht-child .** poi
36ce0 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  nter pointing to
36cf0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a   the new page..*
36d00 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
36d10 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74  rning, all point
36d20 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
36d30 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
36d40 70 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74  pages .** that t
36d50 68 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67  he new child-pag
36d60 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70  e now contains p
36d70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75  ointers to are u
36d80 70 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65  pdated. The.** e
36d90 6e 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69  ntry correspondi
36da0 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69  ng to the new ri
36db0 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65  ght-child pointe
36dc0 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  r of the root.**
36dd0 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70   page is also up
36de0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  dated..**.** If 
36df0 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43  successful, *ppC
36e00 68 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63  hild is set to c
36e10 6f 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e  ontain a referen
36e20 63 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  ce to the child 
36e30 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c  .** page and SQL
36e40 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
36e50 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
36e60 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
36e70 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61  equired.** to ca
36e80 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
36e90 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61   on *ppChild exa
36ea0 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e  ctly once. If an
36eb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a   error occurs,.*
36ec0 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * an error code 
36ed0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
36ee0 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20  *ppChild is set 
36ef0 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  to 0..*/.static 
36f00 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
36f10 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  er(MemPage *pRoo
36f20 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43  t, MemPage **ppC
36f30 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  hild){.  int rc;
36f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
36f60 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
36f70 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
36f80 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20  MemPage *pChild 
36f90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
36fa0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e  * Pointer to a n
36fb0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
36fc0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c  .  Pgno pgnoChil
36fd0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
36fe0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
36ff0 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c   of the new chil
37000 64 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68  d page */.  BtSh
37010 61 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f  ared *pBt = pRoo
37020 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68  t->pBt;    /* Th
37030 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73  e BTree */..  as
37040 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76  sert( pRoot->nOv
37050 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73  erflow>0 );.  as
37060 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
37070 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
37080 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  tex) );..  /* Ma
37090 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f  ke pRoot, the ro
370a0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62  ot page of the b
370b0 2d 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e  -tree, writable.
370c0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
370d0 0a 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20  .  ** page that 
370e0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
370f0 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
37100 6f 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74  of pPage. Copy t
37110 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a  he contents.  **
37120 20 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f   of the node sto
37130 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74  red on pRoot int
37140 6f 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  o the new child 
37150 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  page..  */.  rc 
37160 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
37170 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
37180 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
37190 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
371a0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
371b0 65 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69  eePage(pBt,&pChi
371c0 6c 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52  ld,&pgnoChild,pR
371d0 6f 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20  oot->pgno,0);.  
371e0 20 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e    copyNodeConten
371f0 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c  t(pRoot, pChild,
37200 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49   &rc);.    if( I
37210 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
37220 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
37230 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50  Bt, pgnoChild, P
37240 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f  TRMAP_BTREE, pRo
37250 6f 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ot->pgno, &rc);.
37260 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
37270 72 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69  rc ){.    *ppChi
37280 6c 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65  ld = 0;.    rele
37290 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
372a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
372b0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
372c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
372d0 65 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44  eable(pChild->pD
372e0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
372f0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
37300 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
37310 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
37320 20 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d   assert( pChild-
37330 3e 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e  >nCell==pRoot->n
37340 43 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45  Cell );..  TRACE
37350 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79  (("BALANCE: copy
37360 20 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64   root %d into %d
37370 5c 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f  \n", pRoot->pgno
37380 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29  , pChild->pgno))
37390 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  ;..  /* Copy the
373a0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
373b0 66 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43  from pRoot to pC
373c0 68 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  hild */.  memcpy
373d0 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20  (pChild->aOvfl, 
373e0 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52  pRoot->aOvfl, pR
373f0 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73  oot->nOverflow*s
37400 69 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76  izeof(pRoot->aOv
37410 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c  fl[0]));.  pChil
37420 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70  d->nOverflow = p
37430 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  Root->nOverflow;
37440 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
37450 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f  contents of pRoo
37460 74 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20  t. Then install 
37470 70 43 68 69 6c 64 20 61 73 20 74 68 65 20 72 69  pChild as the ri
37480 67 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20  ght-child. */.  
37490 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20  zeroPage(pRoot, 
374a0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
374b0 20 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20   & ~PTF_LEAF);. 
374c0 20 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74   put4byte(&pRoot
374d0 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
374e0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
374f0 6f 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43  oChild);..  *ppC
37500 68 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20  hild = pChild;. 
37510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37520 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
37530 70 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63  page that pCur c
37540 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
37550 74 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  to has just been
37560 20 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20   modified in.** 
37570 73 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66  some way. This f
37580 75 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20  unction figures 
37590 6f 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69  out if this modi
375a0 66 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74  fication means t
375b0 68 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73  he.** tree needs
375c0 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c   to be balanced,
375d0 20 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73   and if so calls
375e0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
375f0 20 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72   balancing .** r
37600 6f 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e  outine. Balancin
37610 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a  g routines are:.
37620 2a 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  **.**   balance_
37630 71 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c  quick().**   bal
37640 61 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a  ance_deeper().**
37650 20 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f     balance_nonro
37660 6f 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ot().*/.static i
37670 6e 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72  nt balance(BtCur
37680 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
37690 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
376a0 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d  ;.  const int nM
376b0 69 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e  in = pCur->pBt->
376c0 75 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f  usableSize * 2 /
376d0 20 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63   3;.  u8 aBalanc
376e0 65 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b  eQuickSpace[13];
376f0 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30  .  u8 *pFree = 0
37700 3b 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69  ;..  TESTONLY( i
37710 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
37720 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20  _called = 0 );. 
37730 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62   TESTONLY( int b
37740 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61  alance_deeper_ca
37750 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64  lled = 0 );..  d
37760 6f 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  o {.    int iPag
37770 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
37780 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
37790 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
377a0 67 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20  ge[iPage];..    
377b0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a  if( iPage==0 ){.
377c0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
377d0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >nOverflow ){.  
377e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f        /* The roo
377f0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
37800 74 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  tree is overfull
37810 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63  . In this case c
37820 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20  all the.        
37830 2a 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ** balance_deepe
37840 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r() function to 
37850 63 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69  create a new chi
37860 6c 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  ld for the root-
37870 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
37880 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72  and copy the cur
37890 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
378a0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
378b0 6f 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20  o it. The.      
378c0 20 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74    ** next iterat
378d0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
378e0 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20  op will balance 
378f0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a  the child page..
37900 20 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20          */ .    
37910 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c      assert( (bal
37920 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c  ance_deeper_call
37930 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
37940 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
37950 5f 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26  _deeper(pPage, &
37960 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29  pCur->apPage[1])
37970 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
37980 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37990 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
379a0 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Page = 1;.      
379b0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
379c0 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  0] = 0;.        
379d0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d    pCur->aiIdx[1]
379e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
379f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
37a00 50 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c  Page[1]->nOverfl
37a10 6f 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow );.        }.
37a20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
37a30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37a40 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
37a50 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
37a60 6f 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  ow==0 && pPage->
37a70 6e 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20  nFree<=nMin ){. 
37a80 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37a90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d  }else{.      Mem
37aa0 50 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61  Page * const pPa
37ab0 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
37ac0 61 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20  age[iPage-1];.  
37ad0 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49      int const iI
37ae0 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
37af0 5b 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20  [iPage-1];..    
37b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
37b10 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74  gerWrite(pParent
37b20 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
37b30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37b40 5f 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  _OK ){.#ifndef S
37b50 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
37b60 42 41 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20  BALANCE.        
37b70 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
37b80 74 61 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  ta.         && p
37b90 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
37ba0 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
37bb0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  Page->aOvfl[0].i
37bc0 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
37bd0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61  .         && pPa
37be0 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20  rent->pgno!=1.  
37bf0 20 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e         && pParen
37c00 74 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20  t->nCell==iIdx. 
37c10 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
37c20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61      /* Call bala
37c30 6e 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63  nce_quick() to c
37c40 72 65 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c  reate a new sibl
37c50 69 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20  ing of pPage on 
37c60 77 68 69 63 68 0a 20 20 20 20 20 20 20 20 20 20  which.          
37c70 2a 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ** to store the 
37c80 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62  overflow cell. b
37c90 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
37ca0 6e 73 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c  nserts a new cel
37cb0 6c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  l.          ** i
37cc0 6e 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69  nto pParent, whi
37cd0 63 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61  ch may cause pPa
37ce0 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49  rent overflow. I
37cf0 66 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  f this.         
37d00 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
37d10 20 6e 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e   next interation
37d20 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20   of the do-loop 
37d30 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61  will balance pPa
37d40 72 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20  rent .          
37d50 2a 2a 20 75 73 65 20 65 69 74 68 65 72 20 62 61  ** use either ba
37d60 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
37d70 6f 72 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  or balance_deepe
37d80 72 28 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a  r(). Until this.
37d90 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
37da0 70 65 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c  pens, the overfl
37db0 6f 77 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65  ow cell is store
37dc0 64 20 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63  d in the aBalanc
37dd0 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20  eQuickSpace[].  
37de0 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65          ** buffe
37df0 72 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  r. .          **
37e00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
37e10 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65  e purpose of the
37e20 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
37e30 74 28 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20  t() is to check 
37e40 74 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20  that only a.    
37e50 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
37e60 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
37e70 71 75 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20  quick() is made 
37e80 66 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f  for each call to
37e90 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
37ea0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20  ** function. If 
37eb0 74 68 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65  this were not ve
37ec0 72 69 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65  rified, a subtle
37ed0 20 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72   bug involving r
37ee0 65 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a  euse.          *
37ef0 2a 20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63  * of the aBalanc
37f00 65 51 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69  eQuickSpace[] mi
37f10 67 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20  ght sneak in..  
37f20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
37f30 20 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61       assert( (ba
37f40 6c 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c  lance_quick_call
37f50 65 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ed++)==0 );.    
37f60 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
37f70 63 65 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74  ce_quick(pParent
37f80 2c 20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63  , pPage, aBalanc
37f90 65 51 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20  eQuickSpace);.  
37fa0 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
37fb0 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  if.        {.   
37fc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69         /* In thi
37fd0 73 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c  s case, call bal
37fe0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74  ance_nonroot() t
37ff0 6f 20 72 65 64 69 73 74 72 69 62 75 74 65 20 63  o redistribute c
38000 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
38010 2a 20 62 65 74 77 65 65 6e 20 70 50 61 67 65 20  * between pPage 
38020 61 6e 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69  and up to 2 of i
38030 74 73 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ts sibling pages
38040 2e 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a  . This involves.
38050 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64            ** mod
38060 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
38070 6e 74 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20  nts of pParent, 
38080 77 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20  which may cause 
38090 70 50 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20  pParent to.     
380a0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f       ** become o
380b0 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
380c0 66 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69  full. The next i
380d0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
380e0 64 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20  do-loop.        
380f0 20 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63    ** will balanc
38100 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
38110 65 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69  e to correct thi
38120 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s..          ** 
38130 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
38140 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
38150 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c   becomes overful
38160 6c 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  l, the overflow 
38170 63 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20  cell or cells.  
38180 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73          ** are s
38190 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 53 70  tored in the pSp
381a0 61 63 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  ace buffer alloc
381b0 61 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  ated immediately
381c0 20 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20   below. .       
381d0 20 20 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65     ** A subseque
381e0 6e 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  nt iteration of 
381f0 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
38200 20 64 65 61 6c 20 77 69 74 68 20 74 68 69 73 20   deal with this 
38210 62 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  by.          ** 
38220 63 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f  calling balance_
38230 6e 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e  nonroot() (balan
38240 63 65 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20  ce_deeper() may 
38250 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c  be called first,
38260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
38270 74 20 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61  t it doesn't dea
38280 6c 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20  l with overflow 
38290 63 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76  cells - just mov
382a0 65 73 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20  es them to a.   
382b0 20 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72         ** differ
382c0 65 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20  ent page). Once 
382d0 74 68 69 73 20 73 75 62 73 65 71 75 65 6e 74 20  this subsequent 
382e0 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f  call to balance_
382f0 6e 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20  nonroot() .     
38300 20 20 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70       ** has comp
38310 6c 65 74 65 64 2c 20 69 74 20 69 73 20 73 61 66  leted, it is saf
38320 65 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  e to release the
38330 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75   pSpace buffer u
38340 73 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 20  sed by.         
38350 20 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73   ** the previous
38360 20 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76   call, as the ov
38370 65 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61  erflow cell data
38380 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
38390 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
383a0 70 69 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f  pied either into
383b0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64   the body of a d
383c0 61 74 61 62 61 73 65 20 70 61 67 65 20 6f 72 20  atabase page or 
383d0 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
383e0 20 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65         ** pSpace
383f0 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74   buffer passed t
38400 6f 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c  o the latter cal
38410 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  l to balance_non
38420 72 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20  root()..        
38430 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75    */.          u
38440 38 20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69  8 *pSpace = sqli
38450 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43  te3PageMalloc(pC
38460 75 72 2d 3e 70 42