/ Hex Artifact Content
Login

Artifact 64acbd5fd89629d2f52d5d6f851cc534d2a66fbe:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
0910: 50 50 4c 45 5f 5f 29 20 26 26 20 21 64 65 66 69  PPLE__) && !defi
0920: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
0930: 20 26 26 20 21 64 65 66 69 6e 65 64 28 54 48 33   && !defined(TH3
0940: 5f 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 29 0a  _COMPATIBILITY).
0950: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 67 6c 6f 62    /* Enable glob
0960: 61 6c 20 73 68 61 72 65 64 20 63 61 63 68 65 20  al shared cache 
0970: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 62  function for deb
0980: 75 67 67 69 6e 67 20 61 6e 64 20 75 6e 69 74 20  ugging and unit 
0990: 74 65 73 74 73 2c 20 0a 20 20 2a 2a 20 62 75 74  tests, .  ** but
09a0: 20 6e 6f 74 20 66 6f 72 20 72 65 6c 65 61 73 65   not for release
09b0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   */.  return SQL
09c0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 23 65 6c 73  ITE_MISUSE;.#els
09d0: 65 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e.  sqlite3Globa
09e0: 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
09f0: 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61  cheEnabled = ena
0a00: 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ble;.  return SQ
0a10: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
0a20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0a40: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0a50: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0a60: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0a70: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0a80: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0a90: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0aa0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0ab0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0ac0: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0ad0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0ae0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0af0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0b00: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0b10: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0b20: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0b30: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0b40: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0b50: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0b60: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0b70: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0b80: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0b90: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0ba0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0bb0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0bc0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0bd0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0be0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0bf0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0c00: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0c10: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0c20: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0c30: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0c40: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0c50: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0c60: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c70: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0c80: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0c90: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ca0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0cb0: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0cc0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0cd0: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0ce0: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0cf0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d00: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0d10: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0d20: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0d30: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0d40: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0d50: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0d60: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0d70: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0d80: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0d90: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0da0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0db0: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0dc0: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0dd0: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0de0: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0df0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0e00: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0e10: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0e20: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0e30: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0e40: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0e50: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0e60: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0e70: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0e80: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0e90: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ea0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
0eb0: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
0ec0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ed0: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
0ee0: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
0ef0: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
0f00: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
0f10: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
0f20: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
0f30: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
0f40: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
0f50: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
0f60: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
0f70: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
0f80: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
0f90: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
0fa0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
0fb0: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
0fc0: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
0fd0: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
0fe0: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
0ff0: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1000: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1010: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1020: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1030: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1040: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
1050: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
1060: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
1070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1080: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
1090: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
10a0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
10b0: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
10c0: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
10d0: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
10e0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
10f0: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1100: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1110: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1120: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1130: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1140: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1150: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1160: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
1170: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
1180: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
1190: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
11a0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
11b0: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
11c0: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
11d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11e0: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
11f0: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1200: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1210: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1220: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1230: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1240: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
1250: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
1260: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
1270: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
1280: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
1290: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
12a0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
12b0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
12c0: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
12d0: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
12e0: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
12f0: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1300: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1310: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1320: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1330: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1340: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
1350: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
1360: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
1370: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
1380: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
1390: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
13a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
13b0: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
13c0: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
13d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
13e0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
13f0: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1400: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1410: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1420: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1430: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1440: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
1450: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
1460: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
1470: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
1480: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
1490: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
14a0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
14b0: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
14c0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
14d0: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
14e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
14f0: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1500: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1510: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1520: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1530: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1540: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1550: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
1560: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
1570: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
1580: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
1590: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
15a0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
15b0: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
15c0: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
15d0: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
15e0: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
15f0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1600: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1610: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1620: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1630: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1640: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
1650: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
1660: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
1670: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
1680: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
1690: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
16a0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
16b0: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
16c0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
16d0: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
16e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
16f0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1700: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1710: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1720: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1730: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1740: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
1750: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
1760: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
1770: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
1780: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
1790: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
17a0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
17b0: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
17c0: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
17d0: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
17e0: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
17f0: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1800: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1810: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1820: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1830: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1840: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
1850: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
1860: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
1870: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
1880: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
1890: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
18a0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
18b0: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
18c0: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
18d0: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
18e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
18f0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1900: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1910: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1920: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1930: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1940: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1950: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1960: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1970: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1980: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1990: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
19a0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
19b0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
19c0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
19d0: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
19e0: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
19f0: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1a00: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1a10: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1a20: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1a30: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1a40: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1a50: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1a60: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1a70: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1a80: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1a90: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1aa0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1ab0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1ac0: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1ad0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1ae0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1af0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1b00: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1b10: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1b20: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1b30: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1b40: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1b50: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1b60: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1b70: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1b80: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1b90: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1ba0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1bb0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1bc0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1bd0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1be0: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1bf0: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1c00: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1c10: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1c20: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1c30: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1c50: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1c60: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1c70: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1c80: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1c90: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1ca0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1cb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1cc0: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1cd0: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1ce0: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1cf0: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1d00: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1d10: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1d20: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1d30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1d40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1d50: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1d60: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1d70: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1d80: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1d90: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1da0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1db0: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1dc0: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1dd0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1de0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1df0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1e00: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1e10: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1e20: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1e30: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1e40: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1e50: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1e60: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1e70: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1e80: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ea0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
1eb0: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
1ec0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1ed0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
1ee0: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
1ef0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1f00: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1f10: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
1f20: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
1f30: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
1f40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
1f50: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
1f60: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
1f70: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1f80: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
1f90: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
1fa0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
1fb0: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
1fc0: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
1fd0: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
1fe0: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1ff0: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2000: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2010: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2020: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2030: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2040: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
2050: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
2060: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
2070: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
2080: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2090: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
20a0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
20b0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20c0: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
20d0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
20e0: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
20f0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2100: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2110: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2120: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2130: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2140: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
2150: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
2160: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
2170: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2180: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
2190: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
21a0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
21b0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
21c0: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
21d0: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
21e0: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
21f0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2200: 72 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74  r!=p && (pBt->bt
2210: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43  sFlags & BTS_EXC
2220: 4c 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20  LUSIVE)!=0 ){.  
2230: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2240: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2250: 2c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  , pBt->pWriter->
2260: 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  db);.    return 
2270: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
2280: 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
2290: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
22a0: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
22b0: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
22c0: 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  t){.    /* The c
22d0: 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d  ondition (pIter-
22e0: 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69  >eLock!=eLock) i
22f0: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2300: 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20  if(...) .    ** 
2310: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73  statement is a s
2320: 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66  implification of
2330: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
2340: 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f    (eLock==WRITE_
2350: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
2360: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2370: 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
2380: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
2390: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
23a0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
23b0: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
23c0: 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c  n.    ** may hol
23d0: 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f  d a WRITE_LOCK o
23e0: 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74  n any table in t
23f0: 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20  his file (since 
2400: 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a  there can.    **
2410: 20 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c   only be a singl
2420: 65 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a  e writer)..    *
2430: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  /.    assert( pI
2440: 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44  ter->eLock==READ
2450: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  _LOCK || pIter->
2460: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2470: 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
2480: 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43   eLock==READ_LOC
2490: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72  K || pIter->pBtr
24a0: 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e  ee==p || pIter->
24b0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
24c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
24d0: 2d 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70  ->pBtree!=p && p
24e0: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
24f0: 61 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f  ab && pIter->eLo
2500: 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  ck!=eLock ){.   
2510: 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
2520: 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
2530: 62 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  b, pIter->pBtree
2540: 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ->db);.      if(
2550: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
2560: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  CK ){.        as
2570: 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57  sert( p==pBt->pW
2580: 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20  riter );.       
2590: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
25a0: 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20  = BTS_PENDING;. 
25b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
25c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
25d0: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
25e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
25f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
2600: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
2610: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2620: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
2630: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
2640: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
2650: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
2660: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
2670: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
2680: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
2690: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
26a0: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
26b0: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
26c0: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
26d0: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
26e0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  _LOCK..**.** Thi
26f0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2700: 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
2710: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68  :.**.**   (a) Th
2720: 65 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65  e specified Btre
2730: 65 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f  e object p is co
2740: 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61  nnected to a sha
2750: 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64  rable.**       d
2760: 61 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74  atabase (one wit
2770: 68 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73  h the BtShared.s
2780: 68 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74  harable flag set
2790: 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28  ), and.**.**   (
27a0: 62 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65  b) No other Btre
27b0: 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61  e objects hold a
27c0: 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c   lock that confl
27d0: 69 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69  icts.**       wi
27e0: 74 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64  th the requested
27f0: 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72   lock (i.e. quer
2800: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2810: 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20  eLock() has.**  
2820: 20 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65       already bee
2830: 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74  n called and ret
2840: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29  urned SQLITE_OK)
2850: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
2860: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
2870: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
2880: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
2890: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a   SQLITE_NOMEM .*
28a0: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
28b0: 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70   a malloc attemp
28c0: 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  t fails..*/.stat
28d0: 69 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64  ic int setShared
28e0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
28f0: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
2900: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
2910: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2920: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
2930: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
2940: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
2950: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2960: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
2970: 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
2980: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
2990: 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  OCK || eLock==WR
29a0: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  ITE_LOCK );.  as
29b0: 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29  sert( p->db!=0 )
29c0: 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63  ;..  /* A connec
29d0: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65  tion with the re
29e0: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
29f0: 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76  lag set will nev
2a00: 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f  er try to.  ** o
2a10: 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63  btain a read-loc
2a20: 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e  k using this fun
2a30: 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20  ction. The only 
2a40: 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e  read-lock obtain
2a50: 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e  ed.  ** by a con
2a60: 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d  nection in read-
2a70: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65  uncommitted mode
2a80: 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74   is on the sqlit
2a90: 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74  e_master .  ** t
2aa0: 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c  able, and that l
2ab0: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
2ac0: 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61  in BtreeBeginTra
2ad0: 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ns().  */.  asse
2ae0: 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66  rt( 0==(p->db->f
2af0: 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64  lags&SQLITE_Read
2b00: 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20  Uncommitted) || 
2b10: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2b20: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
2b30: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
2b40: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
2b50: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
2b60: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
2b70: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
2b80: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
2b90: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
2ba0: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
2bb0: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
2bc0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
2bd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2be0: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
2bf0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2c00: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
2c10: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
2c20: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
2c30: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
2c40: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
2c50: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
2c60: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
2c70: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
2c80: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
2c90: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
2ca0: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
2cb0: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2cc0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
2cd0: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
2ce0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2cf0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
2d00: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
2d10: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
2d20: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
2d30: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
2d40: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
2d50: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
2d60: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
2d70: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
2d80: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
2d90: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
2da0: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
2db0: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
2dc0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
2dd0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
2de0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2df0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  MEM;.    }.    p
2e00: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69  Lock->iTable = i
2e10: 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b  Table;.    pLock
2e20: 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
2e30: 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d    pLock->pNext =
2e40: 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
2e50: 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c   pBt->pLock = pL
2e60: 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  ock;.  }..  /* S
2e70: 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c  et the BtLock.eL
2e80: 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20  ock variable to 
2e90: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74  the maximum of t
2ea0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a  he current lock.
2eb0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71    ** and the req
2ec0: 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69  uested lock. Thi
2ed0: 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69  s means if a wri
2ee0: 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65  te-lock was alre
2ef0: 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e  ady held.  ** an
2f00: 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65  d a read-lock re
2f10: 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27  quested, we don'
2f20: 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f  t incorrectly do
2f30: 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b  wngrade the lock
2f40: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2f50: 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44   WRITE_LOCK>READ
2f60: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65  _LOCK );.  if( e
2f70: 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  Lock>pLock->eLoc
2f80: 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  k ){.    pLock->
2f90: 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20  eLock = eLock;. 
2fa0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2fb0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2fc0: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2fd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2fe0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2ff0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3000: 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  HE./*.** Release
3010: 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c   all the table l
3020: 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61  ocks (locks obta
3030: 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74  ined via calls t
3040: 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72  o.** the setShar
3050: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
3060: 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65  () procedure) he
3070: 6c 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65  ld by Btree obje
3080: 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ct p..**.** This
3090: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
30a0: 73 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68  s that Btree p h
30b0: 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20  as an open read 
30c0: 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61  or write .** tra
30d0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20  nsaction. If it 
30e0: 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  does not, then t
30f0: 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66  he BTS_PENDING f
3100: 6c 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e  lag.** may be in
3110: 63 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65  correctly cleare
3120: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
3130: 64 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64  d clearAllShared
3140: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
3150: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
3160: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
3170: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
3180: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
3190: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
31a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
31b0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
31c0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
31d0: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
31e0: 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  r );.  assert( p
31f0: 2d 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a  ->inTrans>0 );..
3200: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
3210: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3220: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
3230: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
3240: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
3250: 53 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20  S_EXCLUSIVE)==0 
3260: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
3270: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
3280: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
3290: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
32a0: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
32b0: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
32c0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
32d0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
32e0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
32f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
3300: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
3310: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3320: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3330: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3340: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3350: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
3360: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3370: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
3380: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
3390: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
33a0: 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
33b0: 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49  lags & BTS_PENDI
33c0: 4e 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  NG)==0 || pBt->p
33d0: 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20  Writer );.  if( 
33e0: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20  pBt->pWriter==p 
33f0: 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69  ){.    pBt->pWri
3400: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ter = 0;.    pBt
3410: 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28  ->btsFlags &= ~(
3420: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54  BTS_EXCLUSIVE|BT
3430: 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65  S_PENDING);.  }e
3440: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
3450: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
3460: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
3470: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
3480: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
3490: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
34a0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
34b0: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
34c0: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
34d0: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
34e0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
34f0: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
3500: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
3510: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
3520: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3530: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3540: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
3550: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
3560: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
3570: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53    ** set the BTS
3580: 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f  _PENDING flag to
3590: 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   0..    **.    *
35a0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
35b0: 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72  t currently a wr
35c0: 69 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50  iter, then BTS_P
35d0: 45 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20  ENDING must.    
35e0: 2a 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ** be zero alrea
35f0: 64 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74  dy. So this next
3600: 20 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73   line is harmles
3610: 73 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a  s in that case..
3620: 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
3630: 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
3640: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a  _PENDING;.  }.}.
3650: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3660: 74 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c  tion changes all
3670: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c   write-locks hel
3680: 64 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74  d by Btree p int
3690: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
36a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
36b0: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
36c0: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
36d0: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
36e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
36f0: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3700: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3710: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3720: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3730: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3740: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3750: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3760: 45 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72  ENDING);.    for
3770: 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63  (pLock=pBt->pLoc
3780: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
3790: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
37a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
37b0: 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  ck->eLock==READ_
37c0: 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70  LOCK || pLock->p
37d0: 42 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20  Btree==p );.    
37e0: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
37f0: 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20   READ_LOCK;.    
3800: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20  }.  }.}..#endif 
3810: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
3820: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
3830: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
3840: 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
3850: 2a 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72  *pPage);  /* For
3860: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
3870: 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73  /../*.***** This
3880: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
3890: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
38a0: 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a  t() only ****.**
38b0: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
38c0: 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73  the cursor holds
38d0: 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74   the mutex on it
38e0: 73 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69  s BtShared.*/.#i
38f0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
3900: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72  G.static int cur
3910: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74  sorHoldsMutex(Bt
3920: 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65  Cursor *p){.  re
3930: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
3940: 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
3950: 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66  mutex);.}.#endif
3960: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
3970: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
3980: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
3990: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
39a0: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
39b0: 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c 20 69  r cursor pCur, i
39c0: 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  f any..*/.static
39d0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
39e0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74  OverflowCache(Bt
39f0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
3a00: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
3a10: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
3a20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3a30: 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
3a40: 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65  w);.  pCur->aOve
3a50: 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  rflow = 0;.}../*
3a60: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3a70: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
3a80: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
3a90: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
3aa0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
3ab0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
3ac0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
3ad0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3ae0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
3af0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
3b00: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3b10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3b20: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3b30: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3b40: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3b50: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3b60: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
3b70: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3b80: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
3b90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3ba0: 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  s called before 
3bb0: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f  modifying the co
3bc0: 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c  ntents of a tabl
3bd0: 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61  e.** to invalida
3be0: 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20  te any incrblob 
3bf0: 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  cursors that are
3c00: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20   open on the.** 
3c10: 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  row or one of th
3c20: 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64  e rows being mod
3c30: 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ified..**.** If 
3c40: 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72  argument isClear
3c50: 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74  Table is true, t
3c60: 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63  hen the entire c
3c70: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a  ontents of the.*
3c80: 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74  * table is about
3c90: 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20   to be deleted. 
3ca0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3cb0: 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72  alidate all incr
3cc0: 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20  blob.** cursors 
3cd0: 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20  open on any row 
3ce0: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3cf0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
3d00: 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20  pgnoRoot..**.** 
3d10: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 72  Otherwise, if ar
3d20: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3d30: 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68  ble is false, th
3d40: 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a  en the row with.
3d50: 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73  ** rowid iRow is
3d60: 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20   being replaced 
3d70: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  or deleted. In t
3d80: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3d90: 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73  ate.** only thos
3da0: 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  e incrblob curso
3db0: 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20  rs open on that 
3dc0: 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f  specific row..*/
3dd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76  .static void inv
3de0: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
3df0: 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20  ursors(.  Btree 
3e00: 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  *pBtree,        
3e10: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3e20: 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20  e file to check 
3e30: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20  */.  i64 iRow,  
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3e50: 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d  The rowid that m
3e60: 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67  ight be changing
3e70: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61   */.  int isClea
3e80: 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a  rTable        /*
3e90: 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77   True if all row
3ea0: 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65  s are being dele
3eb0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75  ted */.){.  BtCu
3ec0: 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
3ed0: 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
3ee0: 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
3ef0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
3f00: 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
3f10: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
3f20: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
3f30: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
3f40: 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
3f50: 61 6e 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61  andle && (isClea
3f60: 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66  rTable || p->inf
3f70: 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b  o.nKey==iRow) ){
3f80: 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
3f90: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
3fa0: 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  D;.    }.  }.}..
3fb0: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
3fc0: 66 75 6e 63 74 69 6f 6e 73 20 77 68 65 6e 20 49  functions when I
3fd0: 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74  NCRBLOB is omitt
3fe0: 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  ed */.  #define 
3ff0: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4000: 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64 65  owCache(x).  #de
4010: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41  fine invalidateA
4020: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
4030: 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  x).  #define inv
4040: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
4050: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
4060: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4070: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
4080: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
4090: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
40a0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
40b0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
40c0: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
40d0: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
40e0: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
40f0: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4100: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4110: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4120: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4130: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4140: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
4150: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
4160: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
4170: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
4180: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
4190: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
41a0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
41b0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
41c0: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
41d0: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
41e0: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
41f0: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4200: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4210: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4220: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4230: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4240: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
4250: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
4260: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4270: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
4280: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
4290: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
42a0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
42b0: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
42c0: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
42d0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
42e0: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
42f0: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4300: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4310: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4320: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4330: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4340: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
4350: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
4360: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
4370: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
4380: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
4390: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
43a0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
43b0: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
43c0: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
43d0: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
43e0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
43f0: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4400: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4410: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4420: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4430: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4440: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
4450: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
4460: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
4470: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
4480: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
4490: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
44a0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
44b0: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
44c0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
44d0: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
44e0: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
44f0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4500: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4510: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4520: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4530: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4540: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
4550: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
4560: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
4570: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
4580: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
4590: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
45a0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
45b0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
45c0: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
45d0: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
45e0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
45f0: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4600: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4610: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4620: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4630: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4640: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
4650: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
4660: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4670: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
4680: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
4690: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
46a0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
46b0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
46c0: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
46d0: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
46e0: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
46f0: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4700: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4710: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4720: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4730: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4740: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
4750: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
4760: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
4770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4780: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
4790: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
47a0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
47b0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
47c0: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
47d0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
47e0: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
47f0: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4800: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4810: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4820: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4830: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4840: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4850: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
4860: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4870: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
4880: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
4890: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
48a0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
48b0: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
48c0: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
48d0: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
48e0: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
48f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4900: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4910: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4920: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4930: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4940: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4950: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4960: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4970: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4980: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4990: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
49a0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
49b0: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
49c0: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
49d0: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
49e0: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
49f0: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4a00: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4a10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4a20: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4a30: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4a40: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4a50: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4a60: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4a70: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4a80: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4a90: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4aa0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4ab0: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4ac0: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4ad0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4ae0: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4af0: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4b00: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4b10: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4b20: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4b30: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4b40: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4b50: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4b60: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4b70: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4b80: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4b90: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4ba0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4bb0: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
4bc0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4bd0: 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76  osition in the v
4be0: 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f  ariables BtCurso
4bf0: 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42  r.nKey .** and B
4c00: 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68  tCursor.pKey. Th
4c10: 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74 65  e cursor's state
4c20: 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f   is set to CURSO
4c30: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a  R_REQUIRESEEK..*
4c40: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
4c50: 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
4c60: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76   the cursor is v
4c70: 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74 65  alid (has eState
4c80: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a  ==CURSOR_VALID).
4c90: 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ** prior to call
4ca0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
4cb0: 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .  .*/.static in
4cc0: 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  t saveCursorPosi
4cd0: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
4ce0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
4cf0: 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
4d00: 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
4d10: 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72  State );.  asser
4d20: 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79  t( 0==pCur->pKey
4d30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
4d40: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
4d50: 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20  Cur) );..  rc = 
4d60: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
4d70: 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d  ize(pCur, &pCur-
4d80: 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  >nKey);.  assert
4d90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4da0: 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29  );  /* KeySize()
4db0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a   cannot fail */.
4dc0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
4dd0: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
4de0: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
4df0: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
4e00: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
4e10: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
4e20: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
4e30: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
4e40: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
4e50: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
4e60: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
4e70: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
4e80: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
4e90: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
4ea0: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
4eb0: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
4ec0: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
4ed0: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
4ee0: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
4ef0: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50  if( 0==pCur->apP
4f00: 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
4f10: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
4f20: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
4f30: 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  ( (int)pCur->nKe
4f40: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  y );.    if( pKe
4f50: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
4f60: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
4f70: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
4f80: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
4f90: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
4fa0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4fb0: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
4fc0: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
4fd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4fe0: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
4ff0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
5000: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
5010: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5020: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5030: 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  !pCur->apPage[0]
5040: 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  ->intKey || !pCu
5050: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
5060: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5070: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
5080: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
5090: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
50a0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
50b0: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
50c0: 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  i]);.      pCur-
50d0: 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
50e0: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
50f0: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20  iPage = -1;.    
5100: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
5110: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5120: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
5130: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
5140: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
5150: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5160: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
5170: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
5180: 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74   (except pExcept
5190: 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20  ) that are open 
51a0: 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  on.** the table 
51b0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
51c0: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
51d0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
51e0: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
51f0: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
5200: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
5210: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
5220: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5230: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
5240: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
5250: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
5260: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
5270: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
5280: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
5290: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
52a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
52b0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
52c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
52d0: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
52e0: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
52f0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
5300: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
5310: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
5320: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
5330: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
5340: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
5350: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
5360: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5370: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
5380: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
5390: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
53a0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
53b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
53c0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
53d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
53e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
53f0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
5400: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
5410: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
5420: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
5430: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
5440: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
5450: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5460: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5470: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
5480: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
5490: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
54a0: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
54b0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
54c0: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
54d0: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
54e0: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
54f0: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
5500: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
5510: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
5520: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
5530: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
5540: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
5550: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
5560: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
5570: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
5580: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
5590: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
55a0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
55b0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
55c0: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
55d0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
55e0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
55f0: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
5600: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
5610: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5620: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5630: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5640: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
5650: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
5660: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
5670: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
5680: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
5690: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
56a0: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
56b0: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
56c0: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
56d0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
56e0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5700: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
5710: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5720: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5730: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5740: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
5750: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
5760: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
5770: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
5780: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
5790: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65   */.  char *pFre
57a0: 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b  e = 0;..  if( pK
57b0: 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ey ){.    assert
57c0: 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e  ( nKey==(i64)(in
57d0: 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49  t)nKey );.    pI
57e0: 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56  dxKey = sqlite3V
57f0: 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64  dbeAllocUnpacked
5800: 52 65 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20  Record(.        
5810: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20  pCur->pKeyInfo, 
5820: 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
5830: 53 70 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20  Space), &pFree. 
5840: 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49     );.    if( pI
5850: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
5860: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
5880: 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
5890: 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
58a0: 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64  )nKey, pKey, pId
58b0: 78 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xKey);.  }else{.
58c0: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
58d0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
58e0: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
58f0: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
5900: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
5910: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
5920: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
5930: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
5940: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
5950: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
5960: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5970: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
5980: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
5990: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
59a0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
59b0: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
59c0: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
59d0: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
59e0: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
59f0: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
5a00: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
5a10: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
5a20: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
5a30: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
5a40: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
5a50: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
5a60: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
5a70: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
5a80: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
5a90: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5aa0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
5ab0: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
5ac0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5ad0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5ae0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
5af0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5b00: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
5b10: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
5b20: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5b30: 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
5b40: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5b50: 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
5b60: 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d      return pCur-
5b70: 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  >skipNext;.  }. 
5b80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5b90: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
5ba0: 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65    rc = btreeMove
5bb0: 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70  to(pCur, pCur->p
5bc0: 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c  Key, pCur->nKey,
5bd0: 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 4e   0, &pCur->skipN
5be0: 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ext);.  if( rc==
5bf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
5c10: 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70  ur->pKey);.    p
5c20: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
5c30: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
5c40: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5c50: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
5c60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
5c70: 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72  VALID );.  }.  r
5c80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
5c90: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
5ca0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
5cb0: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
5cc0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5cd0: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
5ce0: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
5cf0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
5d00: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
5d10: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
5d20: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
5d30: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
5d40: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
5d50: 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77  position it.** w
5d60: 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61  as last placed a
5d70: 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20  t.  Cursors can 
5d80: 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f  move when the ro
5d90: 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74  w they are point
5da0: 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c  ing.** at is del
5db0: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
5dc0: 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20  der them..**.** 
5dd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5de0: 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f  urns an error co
5df0: 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  de if something 
5e00: 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65  goes wrong.  The
5e10: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61  .** integer *pHa
5e20: 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  sMoved is set to
5e30: 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72 73   one if the curs
5e40: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64  or has moved and
5e50: 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e   0 if not..*/.in
5e60: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
5e70: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43  rsorHasMoved(BtC
5e80: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
5e90: 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20   *pHasMoved){.  
5ea0: 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  int rc;..  rc = 
5eb0: 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
5ec0: 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
5ed0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48  f( rc ){.    *pH
5ee0: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20  asMoved = 1;.   
5ef0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5f00: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
5f10: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
5f20: 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65   || pCur->skipNe
5f30: 78 74 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48  xt!=0 ){.    *pH
5f40: 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  asMoved = 1;.  }
5f50: 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d  else{.    *pHasM
5f60: 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oved = 0;.  }.  
5f70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5f80: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
5f90: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
5fa0: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
5fb0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
5fc0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
5fd0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
5fe0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
5ff0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
6000: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
6010: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
6020: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
6030: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
6040: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
6050: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
6060: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
6070: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
6080: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
6090: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
60a0: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
60b0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
60c0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
60d0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
60e0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
60f0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
6100: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
6110: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
6120: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
6130: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
6140: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
6150: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6160: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
6170: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6180: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
6190: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
61a0: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
61b0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
61c0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
61d0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
61e0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
61f0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
6200: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
6210: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
6220: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
6230: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
6240: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
6250: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
6260: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
6270: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
6280: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
6290: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
62a0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
62b0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
62c0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
62d0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
62e0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
62f0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
6300: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
6310: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
6320: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
6330: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
6340: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6350: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
6360: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
6370: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
6380: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
6390: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
63a0: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
63b0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
63c0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
63d0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
63e0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
63f0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
6400: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
6410: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
6420: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
6430: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
6440: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6450: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
6460: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
6470: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
6480: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
6490: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
64a0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
64b0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
64c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
64d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
64e0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
64f0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
6500: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
6510: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
6520: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6530: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6540: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
6550: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
6560: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
6570: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
6580: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6590: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
65a0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
65b0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
65c0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
65d0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
65e0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
65f0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
6600: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6610: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
6620: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
6630: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
6640: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
6650: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
6660: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
6670: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
6680: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
6690: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
66a0: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
66b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
66c0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
66d0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
66e0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
66f0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
6700: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
6710: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
6720: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
6730: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6740: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6750: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6760: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6770: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6780: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6790: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
67a0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
67b0: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
67c0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
67d0: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
67e0: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
67f0: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
6800: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
6810: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
6820: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
6830: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
6840: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
6850: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6860: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
6870: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
6880: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
6890: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
68a0: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
68b0: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
68c0: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
68d0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
68e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
68f0: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
6900: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
6910: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6920: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
6930: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
6940: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
6950: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
6960: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
6970: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
6980: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
6990: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
69a0: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
69b0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
69c0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
69d0: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
69e0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
69f0: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
6a00: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
6a10: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
6a20: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
6a30: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
6a40: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
6a50: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
6a60: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
6a70: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
6a80: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
6a90: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
6aa0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
6ab0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
6ac0: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
6ad0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
6ae0: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
6af0: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
6b00: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
6b10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6b20: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6b30: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
6b40: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
6b50: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
6b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
6b70: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
6b80: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
6b90: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
6ba0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6bb0: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
6bc0: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6bd0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6be0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
6bf0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
6c00: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
6c10: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
6c20: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
6c30: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
6c40: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
6c50: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6c60: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
6c70: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
6c80: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
6c90: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
6ca0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
6cb0: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
6cc0: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
6cd0: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
6ce0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
6cf0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
6d00: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
6d10: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
6d20: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
6d30: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
6d40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6d50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
6d60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6d70: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
6d80: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
6d90: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
6da0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6db0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
6dc0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6dd0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
6de0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
6df0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
6e00: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
6e10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
6e20: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
6e30: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
6e40: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
6e50: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
6e60: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
6e70: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6e80: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6e90: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6ea0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
6eb0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
6ec0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
6ed0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
6ee0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
6ef0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
6f00: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
6f10: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
6f20: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
6f30: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
6f40: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43  et2byte(&(P)->aC
6f50: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
6f60: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
6f70: 6c 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b  lv2(D,M,O,I) (D+
6f80: 28 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f  (M&get2byte(D+(O
6f90: 2b 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a  +2*(I))))).../*.
6fa0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6fb0: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6fc0: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6fd0: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6fe0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6ff0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
7000: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
7010: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
7020: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
7030: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
7040: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
7050: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7060: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7070: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
7080: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
7090: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
70a0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
70b0: 20 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69     k = pPage->ai
70c0: 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Ovfl[i];.    if(
70d0: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
70e0: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
70f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
7100: 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b  n pPage->apOvfl[
7110: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
7120: 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d    iCell--;.    }
7130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69  .  }.  return fi
7140: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
7150: 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ell);.}../*.** P
7160: 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74  arse a cell cont
7170: 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69  ent block and fi
7180: 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e  ll in the CellIn
7190: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  fo structure.  T
71a0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20  here.** are two 
71b0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73  versions of this
71c0: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65   function.  btre
71d0: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
71e0: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
71f0: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
7200: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62  d argument and b
7210: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7220: 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70  () .** takes a p
7230: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f  ointer to the bo
7240: 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61  dy of the cell a
7250: 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67  s its second arg
7260: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  ument..**.** Wit
7270: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74  hin this file, t
7280: 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d  he parseCell() m
7290: 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c  acro can be call
72a0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a  ed instead of.**
72b0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
72c0: 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65  tr(). Using some
72d0: 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73   compilers, this
72e0: 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e   will be faster.
72f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7300: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
7310: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
7320: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7330: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7340: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
7350: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
7360: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
7370: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
7380: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
7390: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
73a0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
73b0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
73c0: 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20    u16 n;        
73d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
73e0: 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c  ber bytes in cel
73f0: 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72  l content header
7400: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
7410: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
7420: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
7430: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
7440: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
7450: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7460: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
7470: 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f  tex) );..  pInfo
7480: 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b  ->pCell = pCell;
7490: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
74a0: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
74b0: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
74c0: 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c   n = pPage->chil
74d0: 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65  dPtrSize;.  asse
74e0: 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65  rt( n==4-4*pPage
74f0: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20  ->leaf );.  if( 
7500: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
7510: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
7520: 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
7530: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
7540: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
7550: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73  yload);.    }els
7560: 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61  e{.      nPayloa
7570: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  d = 0;.    }.   
7580: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28   n += getVarint(
7590: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a  &pCell[n], (u64*
75a0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
75b0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
75c0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
75d0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
75e0: 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  >nData = 0;.    
75f0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
7600: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
7610: 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f  load);.    pInfo
7620: 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61  ->nKey = nPayloa
7630: 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e  d;.  }.  pInfo->
7640: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
7650: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48  oad;.  pInfo->nH
7660: 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 74 65 73  eader = n;.  tes
7670: 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d  tcase( nPayload=
7680: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
7690: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
76a0: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
76b0: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
76c0: 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79   if( likely(nPay
76d0: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
76e0: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
76f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
7700: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
7710: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
7720: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
7730: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
7740: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
7750: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
7760: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
7770: 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d   (pInfo->nSize =
7780: 20 28 75 31 36 29 28 6e 2b 6e 50 61 79 6c 6f 61   (u16)(n+nPayloa
7790: 64 29 29 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  d))<4 ) pInfo->n
77a0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
77b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
77c0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20  16)nPayload;.   
77d0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
77e0: 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 0;.  }else{.
77f0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
7800: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
7810: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
7820: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
7830: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
7840: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
7850: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
7860: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
7870: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
7880: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
7890: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
78a0: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
78b0: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
78c0: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
78d0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
78e0: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
78f0: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
7900: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
7910: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
7920: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
7930: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
7940: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
7950: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
7960: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
7970: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
7980: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
7990: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
79a0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
79b0: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
79c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
79d0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
79e0: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
79f0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7a00: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7a10: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
7a20: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
7a30: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
7a40: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
7a50: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
7a60: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
7a70: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
7a80: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
7a90: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
7aa0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
7ab0: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
7ac0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
7ad0: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
7ae0: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
7af0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
7b00: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
7b10: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7b20: 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75  testcase( surplu
7b30: 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  s==maxLocal );. 
7b40: 20 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72     testcase( sur
7b50: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31  plus==maxLocal+1
7b60: 20 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70   );.    if( surp
7b70: 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20  lus <= maxLocal 
7b80: 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e  ){.      pInfo->
7b90: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75  nLocal = (u16)su
7ba0: 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65  rplus;.    }else
7bb0: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
7bc0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
7bd0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
7be0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7bf0: 77 20 3d 20 28 75 31 36 29 28 70 49 6e 66 6f 2d  w = (u16)(pInfo-
7c00: 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b 0a 20 20  >nLocal + n);.  
7c10: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7c20: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
7c30: 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65  w + 4;.  }.}.#de
7c40: 66 69 6e 65 20 70 61 72 73 65 43 65 6c 6c 28 70  fine parseCell(p
7c50: 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e  Page, iCell, pIn
7c60: 66 6f 29 20 5c 0a 20 20 62 74 72 65 65 50 61 72  fo) \.  btreePar
7c70: 73 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65  seCellPtr((pPage
7c80: 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61  ), findCell((pPa
7c90: 67 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28  ge), (iCell)), (
7ca0: 70 49 6e 66 6f 29 29 0a 73 74 61 74 69 63 20 76  pInfo)).static v
7cb0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
7cc0: 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
7cd0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
7ce0: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
7cf0: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
7d00: 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt iCell,       
7d10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65         /* The ce
7d20: 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74  ll index.  First
7d30: 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20   cell is 0 */.  
7d40: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
7d50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
7d60: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
7d70: 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43  e */.){.  parseC
7d80: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
7d90: 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  , pInfo);.}../*.
7da0: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74  ** Compute the t
7db0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
7dc0: 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c  ytes that a Cell
7dd0: 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65   needs in the ce
7de0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20  ll.** data area 
7df0: 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67  of the btree-pag
7e00: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e  e.  The return n
7e10: 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74  umber includes t
7e20: 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20  he cell.** data 
7e30: 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c  header and the l
7e40: 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75  ocal payload, bu
7e50: 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c  t not any overfl
7e60: 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68  ow page or.** th
7e70: 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
7e80: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
7e90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  ..*/.static u16 
7ea0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
7eb0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
7ec0: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
7ed0: 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61  ter = &pCell[pPa
7ee0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
7ef0: 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a  ];.  u32 nSize;.
7f00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
7f10: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
7f20: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
7f30: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
7f40: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
7f50: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
7f60: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
7f70: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
7f80: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
7f90: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
7fa0: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
7fb0: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
7fc0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
7fd0: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
7fe0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
7ff0: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
8000: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
8010: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
8020: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
8030: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62 74   debuginfo;.  bt
8040: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
8050: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
8060: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
8070: 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  f..  if( pPage->
8080: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75 38  intKey ){.    u8
8090: 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28 20   *pEnd;.    if( 
80a0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
80b0: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b 3d  {.      pIter +=
80c0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
80d0: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20 20  er, nSize);.    
80e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 69  }else{.      nSi
80f0: 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ze = 0;.    }.. 
8100: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
8110: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
8120: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
8130: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
8140: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
8150: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
8160: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
8170: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
8180: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
8190: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
81a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
81b0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
81c0: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
81d0: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
81e0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
81f0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
8200: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
8210: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8220: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
8230: 3b 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  ;.  }..  testcas
8240: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8250: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
8260: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8270: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
8280: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
8290: 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  >pPage->maxLocal
82a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   ){.    int minL
82b0: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69  ocal = pPage->mi
82c0: 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69 7a  nLocal;.    nSiz
82d0: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  e = minLocal + (
82e0: 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c  nSize - minLocal
82f0: 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
8300: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
8310: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8320: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
8330: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
8340: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
8350: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
8360: 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a   );.    if( nSiz
8370: 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  e>pPage->maxLoca
8380: 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65  l ){.      nSize
8390: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20   = minLocal;.   
83a0: 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20   }.    nSize += 
83b0: 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20 2b  4;.  }.  nSize +
83c0: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
83d0: 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54 68  pCell);..  /* Th
83e0: 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
83f0: 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34 20  f any cell is 4 
8400: 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28 20  bytes. */.  if( 
8410: 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20 6e  nSize<4 ){.    n
8420: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a 20  Size = 4;.  }.. 
8430: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
8440: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
8450: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
8460: 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64 65  )nSize;.}..#ifde
8470: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
8480: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
8490: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
84a0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
84b0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
84c0: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
84d0: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
84e0: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
84f0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
8500: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c  l){.  return cel
8510: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
8520: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
8530: 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69  iCell));.}.#endi
8540: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
8550: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
8560: 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  M./*.** If the c
8570: 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20  ell pCell, part 
8580: 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f  of page pPage co
8590: 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
85a0: 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  .** to an overfl
85b0: 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20  ow page, insert 
85c0: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
85d0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a  e pointer-map.**
85e0: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
85f0: 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  w page..*/.stati
8600: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8610: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
8620: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
8630: 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  l, int *pRC){.  
8640: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
8650: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
8660: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  rn;.  assert( pC
8670: 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72 65  ell!=0 );.  btre
8680: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8690: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
86a0: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
86b0: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
86c0: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
86d0: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
86e0: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
86f0: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
8700: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
8710: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
8720: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
8730: 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  );.    ptrmapPut
8740: 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66  (pPage->pBt, ovf
8750: 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
8760: 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
8770: 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  , pRC);.  }.}.#e
8780: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
8790: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
87a0: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
87b0: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
87c0: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
87d0: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
87e0: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
87f0: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
8800: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
8810: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
8820: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
8830: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
8840: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
8850: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8860: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
8870: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
8880: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
8890: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
88c0: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
88f0: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
8900: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
8910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8920: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
8930: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
8940: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
8950: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
8960: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
8970: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
8980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8990: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
89a0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
89b0: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
89c0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
89d0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
89e0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
89f0: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
8a20: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8a30: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
8a40: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
8a50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8a60: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
8a70: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
8a80: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
8a90: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
8aa0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
8ab0: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
8ac0: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
8ad0: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
8ae0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
8af0: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
8b00: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
8b10: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
8b20: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
8b30: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
8b40: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
8b50: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
8b60: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8b70: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8b80: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8b90: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8ba0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8bb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
8bc0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
8bd0: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
8be0: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
8bf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
8c00: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
8c10: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8c20: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8c30: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8c40: 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74  ;.  temp = sqlit
8c50: 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
8c60: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
8c70: 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  ger);.  data = p
8c80: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
8c90: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8ca0: 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66  ffset;.  cellOff
8cb0: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
8cc0: 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c  lOffset;.  nCell
8cd0: 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
8ce0: 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c  .  assert( nCell
8cf0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
8d00: 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73  [hdr+3]) );.  us
8d10: 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65  ableSize = pPage
8d20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
8d30: 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  e;.  cbrk = get2
8d40: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
8d50: 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65  ]);.  memcpy(&te
8d60: 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b  mp[cbrk], &data[
8d70: 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a  cbrk], usableSiz
8d80: 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72  e - cbrk);.  cbr
8d90: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
8da0: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
8db0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
8dc0: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
8dd0: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
8de0: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
8df0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
8e00: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
8e10: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
8e20: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
8e30: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
8e40: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
8e50: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
8e60: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
8e70: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8e80: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
8e90: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
8ea0: 6c 6c 4c 61 73 74 20 29 3b 0a 23 69 66 20 21 64  llLast );.#if !d
8eb0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8ec0: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
8ed0: 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a  LL_CHECK).    /*
8ee0: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
8ef0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
8f00: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
8f10: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
8f20: 20 20 20 20 2a 2a 20 69 66 20 53 51 4c 49 54 45      ** if SQLITE
8f30: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
8f40: 5f 43 45 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64  _CELL_CHECK is d
8f50: 65 66 69 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20  efined .    */. 
8f60: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
8f70: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
8f80: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  Last ){.      re
8f90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8fa0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
8fb0: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
8fc0: 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73  t( pc>=iCellFirs
8fd0: 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61  t && pc<=iCellLa
8fe0: 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  st );.    size =
8ff0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
9000: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
9010: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
9020: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
9030: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52  LITE_ENABLE_OVER
9040: 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29  SIZE_CELL_CHECK)
9050: 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43  .    if( cbrk<iC
9060: 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
9070: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9080: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
9090: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
90a0: 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73  ( cbrk<iCellFirs
90b0: 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  t || pc+size>usa
90c0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
90d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
90e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
90f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73   }.#endif.    as
9100: 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c  sert( cbrk+size<
9110: 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63  =usableSize && c
9120: 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20  brk>=iCellFirst 
9130: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
9140: 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62   cbrk+size==usab
9150: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65  leSize );.    te
9160: 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d  stcase( pc+size=
9170: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
9180: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9190: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
91a0: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
91b0: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
91c0: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
91d0: 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72  ( cbrk>=iCellFir
91e0: 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  st );.  put2byte
91f0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
9200: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
9210: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
9220: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
9230: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
9240: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43   memset(&data[iC
9250: 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62  ellFirst], 0, cb
9260: 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a  rk-iCellFirst);.
9270: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9280: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
9290: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
92a0: 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d  ) );.  if( cbrk-
92b0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
92c0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
92d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
92e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
92f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9300: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
9310: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
9320: 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20  s of space from 
9330: 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65  within the B-Tre
9340: 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a  e page passed.**
9350: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
9360: 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e  gument. Write in
9370: 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64  to *pIdx the ind
9380: 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61  ex into pPage->a
9390: 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65  Data[].** of the
93a0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
93b0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
93c0: 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51  Return either SQ
93d0: 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e  LITE_OK or.** an
93e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75   error code (usu
93f0: 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52  ally SQLITE_CORR
9400: 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  UPT)..**.** The 
9410: 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65  caller guarantee
9420: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
9430: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
9440: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20   to make the.** 
9450: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69  allocation.  Thi
9460: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
9470: 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65  need to defragme
9480: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  nt in order to b
9490: 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20  ring.** all the 
94a0: 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20  space together, 
94b0: 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72  however.  This r
94c0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69  outine will avoi
94d0: 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  d using.** the f
94e0: 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70  irst two bytes p
94f0: 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  ast the cell poi
9500: 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20  nter area since 
9510: 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a  presumably this.
9520: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ** allocation is
9530: 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f   being made in o
9540: 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61  rder to insert a
9550: 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65   new cell, so we
9560: 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e   will.** also en
9570: 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e  d up needing a n
9580: 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  ew cell pointer.
9590: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
95a0: 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d  llocateSpace(Mem
95b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
95c0: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64   nByte, int *pId
95d0: 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  x){.  const int 
95e0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
95f0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f  Offset;    /* Lo
9600: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
9610: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f  ge->hdrOffset */
9620: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61  .  u8 * const da
9630: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
9640: 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  a;      /* Local
9650: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
9660: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  >aData */.  int 
9670: 6e 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20  nFrag;          
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72   /* Number of fr
96a0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f  agmented bytes o
96b0: 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  n pPage */.  int
96c0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
96f0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
9700: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61  area */.  int ga
9710: 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  p;        /* Fir
9720: 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62  st byte of gap b
9730: 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e  etween cell poin
9740: 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f  ters and cell co
9750: 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72  ntent */.  int r
9760: 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  c;         /* In
9770: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
9780: 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
9790: 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65  eSize; /* Usable
97a0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   size of the pag
97b0: 65 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  e */.  .  assert
97c0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
97d0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
97e0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
97f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
9800: 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t );.  assert( s
9810: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9820: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9830: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
9840: 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f  ( nByte>=0 );  /
9850: 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73  * Minimum cell s
9860: 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73  ize is 4 */.  as
9870: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
9880: 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61  ee>=nByte );.  a
9890: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
98a0: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
98b0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
98c0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
98d0: 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ize;.  assert( n
98e0: 42 79 74 65 20 3c 20 75 73 61 62 6c 65 53 69 7a  Byte < usableSiz
98f0: 65 2d 38 20 29 3b 0a 0a 20 20 6e 46 72 61 67 20  e-8 );..  nFrag 
9900: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20  = data[hdr+7];. 
9910: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9920: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64  cellOffset == hd
9930: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
9940: 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20  ->leaf );.  gap 
9950: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
9960: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
9970: 43 65 6c 6c 3b 0a 20 20 74 6f 70 20 3d 20 67 65  Cell;.  top = ge
9980: 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
9990: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
99a0: 66 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74  f( gap>top ) ret
99b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
99c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 74 65 73 74 63  PT_BKPT;.  testc
99d0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
99e0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
99f0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
9a00: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
9a10: 70 20 29 3b 0a 0a 20 20 69 66 28 20 6e 46 72 61  p );..  if( nFra
9a20: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20  g>=60 ){.    /* 
9a30: 41 6c 77 61 79 73 20 64 65 66 72 61 67 6d 65 6e  Always defragmen
9a40: 74 20 68 69 67 68 6c 79 20 66 72 61 67 6d 65 6e  t highly fragmen
9a50: 74 65 64 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  ted pages */.   
9a60: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
9a70: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
9a80: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9a90: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
9aa0: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
9ab0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
9ac0: 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b 32 3c  }else if( gap+2<
9ad0: 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 53  =top ){.    /* S
9ae0: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
9af0: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
9b00: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
9b10: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
9b20: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
9b30: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
9b40: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
9b50: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
9b60: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
9b70: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
9b80: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
9b90: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
9ba0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
9bb0: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
9bc0: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
9bd0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
9be0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
9bf0: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
9c00: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
9c10: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
9c20: 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  e free slot */. 
9c30: 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62       if( pc>usab
9c40: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 61  leSize-4 || pc<a
9c50: 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 20  ddr+4 ){.       
9c60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
9c70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9c80: 20 20 20 7d 0a 20 20 20 20 20 20 73 69 7a 65 20     }.      size 
9c90: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
9ca0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
9cb0: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
9cc0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
9cd0: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
9ce0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9cf0: 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ( x==4 );.      
9d00: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
9d10: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
9d20: 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  x<4 ){.         
9d30: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73   /* Remove the s
9d40: 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65  lot from the fre
9d50: 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74  e-list. Update t
9d60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  he number of.   
9d70: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
9d80: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
9d90: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
9da0: 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
9db0: 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61  &data[addr], &da
9dc0: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
9dd0: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
9de0: 5d 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b  ] = (u8)(nFrag +
9df0: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   x);.        }el
9e00: 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e  se if( size+pc >
9e10: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
9e20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9e30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9e40: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  KPT;.        }el
9e50: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
9e60: 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e   The slot remain
9e70: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  s on the free-li
9e80: 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73  st. Reduce its s
9e90: 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20  ize to account. 
9ea0: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
9eb0: 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64  the portion used
9ec0: 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f   by the new allo
9ed0: 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
9ee0: 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
9ef0: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
9f00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9f10: 20 2a 70 49 64 78 20 3d 20 70 63 20 2b 20 78 3b   *pIdx = pc + x;
9f20: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
9f30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
9f40: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
9f50: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
9f60: 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20 65   sure there is e
9f70: 6e 6f 75 67 68 20 73 70 61 63 65 20 69 6e 20 74  nough space in t
9f80: 68 65 20 67 61 70 20 74 6f 20 73 61 74 69 73 66  he gap to satisf
9f90: 79 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 6f 63  y.  ** the alloc
9fa0: 61 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 74 2c 20  ation.  If not, 
9fb0: 64 65 66 72 61 67 6d 65 6e 74 2e 0a 20 20 2a 2f  defragment..  */
9fc0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
9fd0: 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b  +2+nByte==top );
9fe0: 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79  .  if( gap+2+nBy
9ff0: 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 72 63  te>top ){.    rc
a000: 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
a010: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
a020: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a030: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
a040: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
a050: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
a060: 73 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65  ssert( gap+nByte
a070: 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20  <=top );.  }... 
a080: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
a090: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
a0a0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
a0b0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
a0c0: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
a0d0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
a0e0: 61 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69  a.  The btreeIni
a0f0: 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73  tPage() call has
a100: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
a110: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
a120: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
a130: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
a140: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
a150: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
a160: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
a170: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
a180: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a190: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
a1a0: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
a1b0: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
a1c0: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
a1d0: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
a1e0: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
a1f0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
a200: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
a210: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
a220: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
a230: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
a240: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
a250: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a260: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
a270: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
a280: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
a290: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
a2a0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a2b0: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
a2c0: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
a2d0: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
a2e0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
a2f0: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
a300: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
a310: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
a320: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
a330: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
a340: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
a350: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
a360: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
a370: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ck..*/.static in
a380: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
a390: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
a3a0: 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29  start, int size)
a3b0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62  {.  int addr, pb
a3c0: 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74  egin, hdr;.  int
a3d0: 20 69 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20   iLast;         
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a3f0: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
a400: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
a410: 73 65 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  set */.  unsigne
a420: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
a430: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20  Page->aData;..  
a440: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
a450: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
a460: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
a470: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
a480: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
a490: 61 73 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70  assert( start>=p
a4a0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
a4b0: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
a4c0: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
a4d0: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
a4e0: 29 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  ) <= (int)pPage-
a4f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
a500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
a510: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
a520: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
a530: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
a540: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
a550: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
a560: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 20 20 69 66  ze is 4 */..  if
a570: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74  ( pPage->pBt->bt
a580: 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
a590: 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  URE_DELETE ){.  
a5a0: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
a5b0: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
a5c0: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
a5d0: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
a5e0: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
a5f0: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
a600: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
a610: 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  a[start], 0, siz
a620: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  e);.  }..  /* Ad
a630: 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63 6b  d the space back
a640: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
a650: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f   list of freeblo
a660: 63 6b 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  cks.  Note that.
a670: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
a680: 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c   the freeblock l
a690: 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20  ist was checked 
a6a0: 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  by btreeInitPage
a6b0: 28 29 2c 0a 20 20 2a 2a 20 62 74 72 65 65 49 6e  (),.  ** btreeIn
a6c0: 69 74 50 61 67 65 28 29 20 64 69 64 20 6e 6f 74  itPage() did not
a6d0: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 70   detect overlapp
a6e0: 69 6e 67 20 63 65 6c 6c 73 20 6f 72 0a 20 20 2a  ing cells or.  *
a6f0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  * freeblocks tha
a700: 74 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c  t overlapped cel
a710: 6c 73 2e 20 20 20 4e 6f 72 20 64 6f 65 73 20 69  ls.   Nor does i
a720: 74 20 64 65 74 65 63 74 20 77 68 65 6e 20 74 68  t detect when th
a730: 65 0a 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 74  e.  ** cell cont
a740: 65 6e 74 20 61 72 65 61 20 65 78 63 65 65 64 73  ent area exceeds
a750: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
a760: 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 20 20  e page header.  
a770: 49 66 20 74 68 65 73 65 0a 20 20 2a 2a 20 73 69  If these.  ** si
a780: 74 75 61 74 69 6f 6e 73 20 61 72 69 73 65 2c 20  tuations arise, 
a790: 74 68 65 6e 20 73 75 62 73 65 71 75 65 6e 74 20  then subsequent 
a7a0: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
a7b0: 73 20 6d 69 67 68 74 20 63 6f 72 72 75 70 74 0a  s might corrupt.
a7c0: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73    ** the freelis
a7d0: 74 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 65 65  t.  So we do nee
a7e0: 64 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 63  d to check for c
a7f0: 6f 72 72 75 70 74 69 6f 6e 20 77 68 69 6c 65 20  orruption while 
a800: 73 63 61 6e 6e 69 6e 67 0a 20 20 2a 2a 20 74 68  scanning.  ** th
a810: 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
a820: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
a830: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64  hdrOffset;.  add
a840: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
a850: 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  Last = pPage->pB
a860: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
a870: 34 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  4;.  assert( sta
a880: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 20 20 77  rt<=iLast );.  w
a890: 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20  hile( (pbegin = 
a8a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  get2byte(&data[a
a8b0: 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20  ddr]))<start && 
a8c0: 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20  pbegin>0 ){.    
a8d0: 69 66 28 20 70 62 65 67 69 6e 3c 61 64 64 72 2b  if( pbegin<addr+
a8e0: 34 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  4 ){.      retur
a8f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a900: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
a910: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
a920: 20 20 7d 0a 20 20 69 66 28 20 70 62 65 67 69 6e    }.  if( pbegin
a930: 3e 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 72 65  >iLast ){.    re
a940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a950: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
a960: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
a970: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
a980: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
a990: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
a9a0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
a9b0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
a9c0: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
a9d0: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
a9e0: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
a9f0: 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
aa00: 6e 46 72 65 65 20 2b 20 28 75 31 36 29 73 69 7a  nFree + (u16)siz
aa10: 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63  e;..  /* Coalesc
aa20: 65 20 61 64 6a 61 63 65 6e 74 20 66 72 65 65 20  e adjacent free 
aa30: 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72  blocks */.  addr
aa40: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
aa50: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
aa60: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
aa70: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
aa80: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
aa90: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
aaa0: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
aab0: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
aac0: 6e 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  n <= (int)pPage-
aad0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
aae0: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
aaf0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ab00: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
ab10: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
ab20: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
ab30: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
ab40: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
ab50: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
ab60: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
ab70: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
ab80: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
ab90: 20 20 20 69 66 28 20 28 66 72 61 67 3c 30 29 20     if( (frag<0) 
aba0: 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61  || (frag>(int)da
abb0: 74 61 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20  ta[hdr+7]) ){.  
abc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
abd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
abe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
abf0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28  data[hdr+7] -= (
ac00: 75 38 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78  u8)frag;.      x
ac10: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
ac20: 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20  a[pnext]);.     
ac30: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
ac40: 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20  pbegin], x);.   
ac50: 20 20 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67     x = pnext + g
ac60: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
ac70: 65 78 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e  ext+2]) - pbegin
ac80: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
ac90: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
aca0: 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , x);.    }else{
acb0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70 62  .      addr = pb
acc0: 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  egin;.    }.  }.
acd0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
ace0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62  l content area b
acf0: 65 67 69 6e 73 20 77 69 74 68 20 61 20 66 72 65  egins with a fre
ad00: 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69  eblock, remove i
ad10: 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61  t. */.  if( data
ad20: 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64  [hdr+1]==data[hd
ad30: 72 2b 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72  r+5] && data[hdr
ad40: 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d  +2]==data[hdr+6]
ad50: 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b   ){.    int top;
ad60: 0a 20 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65  .    pbegin = ge
ad70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
ad80: 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  +1]);.    memcpy
ad90: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26  (&data[hdr+1], &
ada0: 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29  data[pbegin], 2)
adb0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
adc0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
add0: 5d 29 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  ]) + get2byte(&d
ade0: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
adf0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
ae00: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
ae10: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
ae20: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
ae30: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
ae40: 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
ae50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ae60: 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68  ./*.** Decode th
ae70: 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74 68  e flags byte (th
ae80: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
ae90: 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72 20  the header) for 
aea0: 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e  a page.** and in
aeb0: 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20  itialize fields 
aec0: 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73  of the MemPage s
aed0: 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64 69  tructure accordi
aee0: 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ngly..**.** Only
aef0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
af00: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
af10: 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74  supported.  Anyt
af20: 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a  hing different.*
af30: 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f  * indicates a co
af40: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
af50: 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  iles:.**.**     
af60: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
af70: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
af80: 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c  ZERODATA | PTF_L
af90: 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  EAF.**         P
afa0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
afb0: 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20  F_INTKEY.**     
afc0: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
afd0: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20   | PTF_INTKEY | 
afe0: 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74  PTF_LEAF.*/.stat
aff0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61  ic int decodeFla
b000: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
b010: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
b020: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
b030: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
b040: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
b050: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
b060: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
b070: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b080: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
b090: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b0a0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b0b0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b0c0: 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20    pPage->leaf = 
b0d0: 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33  (u8)(flagByte>>3
b0e0: 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f  );  assert( PTF_
b0f0: 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a  LEAF == 1<<3 );.
b100: 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50    flagByte &= ~P
b110: 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65  TF_LEAF;.  pPage
b120: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
b130: 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   4-4*pPage->leaf
b140: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
b150: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
b160: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
b170: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
b180: 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) ){.    pPage->
b190: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
b1a0: 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d  pPage->hasData =
b1b0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20   pPage->leaf;.  
b1c0: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
b1d0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  l = pBt->maxLeaf
b1e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
b1f0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
b200: 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Leaf;.  }else if
b210: 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f  ( flagByte==PTF_
b220: 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20  ZERODATA ){.    
b230: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
b240: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  0;.    pPage->ha
b250: 73 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  sData = 0;.    p
b260: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d  Page->maxLocal =
b270: 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a   pBt->maxLocal;.
b280: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
b290: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f  cal = pBt->minLo
b2a0: 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  cal;.  }else{.  
b2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b2c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b2d0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
b2e0: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
b2f0: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
b300: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
b310: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b320: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
b330: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
b340: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
b350: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
b360: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
b370: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
b380: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
b390: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
b3a0: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
b3b0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
b3c0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
b3d0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
b3e0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
b3f0: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
b400: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
b410: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
b420: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
b430: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
b440: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
b450: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
b460: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
b470: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
b480: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
b490: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
b4a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
b4b0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
b4c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b4d0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b4e0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b4f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b500: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
b510: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
b520: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b530: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b540: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
b550: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
b560: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b570: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
b580: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
b590: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
b5a0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
b5b0: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
b5c0: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
b5d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b5e0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
b5f0: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
b600: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
b610: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
b620: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
b630: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
b640: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
b650: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
b660: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
b670: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
b680: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
b690: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
b6a0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
b6b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
b6c0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
b6d0: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
b6e0: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
b6f0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
b700: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
b710: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
b720: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
b730: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
b740: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
b750: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
b760: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
b770: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
b780: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
b790: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
b7a0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
b7b0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
b7c0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
b7d0: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
b7e0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
b7f0: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
b800: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
b810: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
b820: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
b830: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
b840: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
b850: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
b860: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
b870: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
b880: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
b890: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
b8a0: 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  ;.    if( decode
b8b0: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
b8c0: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
b8d0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b8e0: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
b8f0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
b900: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
b910: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
b920: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
b930: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
b940: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
b950: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
b960: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
b970: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
b980: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
b990: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
b9a0: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
b9b0: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
b9c0: 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70  age->leaf;.    p
b9d0: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
b9e0: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
b9f0: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
ba00: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
ba10: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
ba20: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
ba30: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
ba40: 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  +5]);.    pPage-
ba50: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
ba60: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
ba70: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
ba80: 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42  nCell>MX_CELL(pB
ba90: 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  t) ){.      /* T
baa0: 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72  o many cells for
bab0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20   a single page. 
bac0: 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   The page must b
bad0: 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20  e corrupt */.   
bae0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
baf0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bb00: 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
bb10: 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
bb20: 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
bb30: 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f  ..    /* A malfo
bb40: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
bb50: 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 75  ge might cause u
bb60: 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20 74  s to read past t
bb70: 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66  he end.    ** of
bb80: 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73 69   page when parsi
bb90: 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20  ng a cell.  .   
bba0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   **.    ** The f
bbb0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
bbc0: 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
bbd0: 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
bbe0: 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 20  cell extends.   
bbf0: 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
bc00: 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
bc10: 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
bc20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
bc30: 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74 75   be .    ** retu
bc40: 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e  rned if it does.
bc50: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c  .    */.    iCel
bc60: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
bc70: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
bc80: 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c  Cell;.    iCellL
bc90: 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ast = usableSize
bca0: 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69 6e 65   - 4;.#if define
bcb0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
bcc0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
bcd0: 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20  ECK).    {.     
bce0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
bcf0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
bd00: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
bd10: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20  r array */.     
bd20: 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20   int sz;        
bd30: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
bd40: 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69  cell */..      i
bd50: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
bd60: 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20  ) iCellLast--;. 
bd70: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bd80: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
bd90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d  +){.        pc =
bda0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bdb0: 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29  cellOffset+i*2])
bdc0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bdd0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
bde0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  st );.        te
bdf0: 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c  stcase( pc==iCel
be00: 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20 20  lLast );.       
be10: 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72   if( pc<iCellFir
be20: 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61  st || pc>iCellLa
be30: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
be40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
be50: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
be60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a      }.        sz
be70: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
be80: 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29  Page, &data[pc])
be90: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
bea0: 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c  se( pc+sz==usabl
beb0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20  eSize );.       
bec0: 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c   if( pc+sz>usabl
bed0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
bee0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bef0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bf00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bf10: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
bf20: 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c  e->leaf ) iCellL
bf30: 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 23  ast++;.    }  .#
bf40: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f  endif..    /* Co
bf50: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
bf60: 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68  free space on th
bf70: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63  e page */.    pc
bf80: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bf90: 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e  a[hdr+1]);.    n
bfa0: 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b  Free = data[hdr+
bfb0: 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68  7] + top;.    wh
bfc0: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
bfd0: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
bfe0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
bff0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c000: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
c010: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f        /* Start o
c020: 66 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20  f free block is 
c030: 6f 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a  off the page */.
c040: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c050: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
c060: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
c070: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
c080: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
c090: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
c0a0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
c0b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
c0c0: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
c0d0: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
c0e0: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
c0f0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
c100: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
c110: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
c120: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
c130: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
c140: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
c150: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
c160: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
c170: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
c180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c190: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c1a0: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
c1b0: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
c1c0: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
c1d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c1e0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
c1f0: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
c200: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
c210: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
c220: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
c230: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
c240: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
c250: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
c260: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
c270: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c280: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
c290: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
c2a0: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
c2b0: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
c2c0: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
c2d0: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
c2e0: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
c2f0: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
c300: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
c310: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
c320: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
c330: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
c340: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
c350: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
c360: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
c370: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
c380: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
c390: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c3a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c3b0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
c3c0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
c3d0: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
c3e0: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
c3f0: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
c400: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
c410: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c420: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
c430: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
c440: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
c450: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
c460: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
c470: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
c480: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
c490: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
c4a0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
c4b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c4c0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c4d0: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
c4e0: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
c4f0: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
c500: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
c510: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
c520: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c530: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
c540: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
c550: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
c560: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c570: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
c580: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
c590: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
c5a0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c5b0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c5c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
c5d0: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
c5e0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c5f0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
c600: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
c610: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c620: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
c630: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
c640: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
c650: 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
c660: 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
c670: 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
c680: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c690: 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
c6a0: 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
c6b0: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
c6c0: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
c6d0: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
c6e0: 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65  0 ?1:0);.  memse
c6f0: 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
c700: 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
c710: 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
c720: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c730: 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
c740: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
c750: 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
c760: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
c770: 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
c780: 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
c790: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  );.  pPage->hdrO
c7a0: 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70  ffset = hdr;.  p
c7b0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c7c0: 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67   = first;.  pPag
c7d0: 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64  e->aDataEnd = &d
c7e0: 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
c7f0: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
c800: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
c810: 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d  first];.  pPage-
c820: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
c830: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
c840: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
c850: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
c860: 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
c870: 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
c880: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
c890: 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
c8a0: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
c8b0: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
c8c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
c8d0: 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
c8e0: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
c8f0: 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
c900: 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
c910: 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
c920: 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
c930: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
c940: 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
c950: 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
c960: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
c970: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
c980: 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
c990: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c9a0: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
c9b0: 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
c9c0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
c9d0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
c9e0: 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
c9f0: 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
ca00: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
ca10: 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
ca20: 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
ca30: 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  set = pPage->pgn
ca40: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a  o==1 ? 100 : 0;.
ca50: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20    return pPage; 
ca60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
ca70: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
ca80: 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65  ger.  Initialize
ca90: 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
caa0: 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
cab0: 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
cac0: 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  f needed..**.** 
cad0: 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74  If the noContent
cae0: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74   flag is set, it
caf0: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
cb00: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
cb10: 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  .** the content 
cb20: 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
cb30: 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f  his time.  So do
cb40: 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64   not go to the d
cb50: 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20  isk.** to fetch 
cb60: 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75  the content.  Ju
cb70: 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63  st fill in the c
cb80: 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
cb90: 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66  s for now..** If
cba0: 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
cbb0: 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61  e call sqlite3Pa
cbc0: 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68  gerWrite() on th
cbd0: 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a  is page, that.**
cbe0: 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73   means we have s
cbf0: 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e  tarted to be con
cc00: 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e  cerned about con
cc10: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73  tent and the dis
cc20: 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64  k.** read should
cc30: 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70   occur at that p
cc40: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
cc50: 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65  int btreeGetPage
cc60: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
cc70: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
cc80: 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
cc90: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
cca0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
ccb0: 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
ccc0: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
ccd0: 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
cce0: 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
ccf0: 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
cd00: 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74  .  int noContent
cd10: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
cd20: 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74  t load page cont
cd30: 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ent if true */.)
cd40: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
cd50: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
cd60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
cd70: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
cd80: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
cd90: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
cda0: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
cdb0: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
cdc0: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
cdd0: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
cde0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cdf0: 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65    *ppPage = btre
ce00: 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
ce10: 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
ce20: 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Bt);.  return SQ
ce30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
ce40: 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67  * Retrieve a pag
ce50: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
ce60: 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72   cache. If the r
ce70: 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
ce80: 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20   not.** already 
ce90: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
cea0: 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  he return NULL. 
ceb0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
cec0: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
ced0: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
cee0: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
cef0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  ed..*/.static Me
cf00: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
cf10: 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20  Lookup(BtShared 
cf20: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
cf30: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
cf40: 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  age;.  assert( s
cf50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
cf60: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
cf70: 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
cf80: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
cf90: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
cfa0: 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
cfb0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
cfc0: 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
cfd0: 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e  age(pDbPage, pgn
cfe0: 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72  o, pBt);.  }.  r
cff0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d000: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
d010: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
d020: 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e  e file in pages.
d030: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   If there is any
d040: 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f   kind of.** erro
d050: 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69  r, return ((unsi
d060: 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f  gned int)-1)..*/
d070: 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72  .static Pgno btr
d080: 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68  eePagecount(BtSh
d090: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65  ared *pBt){.  re
d0a0: 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b  turn pBt->nPage;
d0b0: 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  .}.u32 sqlite3Bt
d0c0: 72 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65  reeLastPage(Btre
d0d0: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
d0e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
d0f0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
d100: 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74  assert( ((p->pBt
d110: 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30  ->nPage)&0x80000
d120: 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  00)==0 );.  retu
d130: 72 6e 20 28 69 6e 74 29 62 74 72 65 65 50 61 67  rn (int)btreePag
d140: 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
d150: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
d160: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
d170: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
d180: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
d190: 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a  ine is just a.**
d1a0: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
d1b0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
d1c0: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74  rate calls to bt
d1d0: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
d1e0: 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61   .** btreeInitPa
d1f0: 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ge()..**.** If a
d200: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
d210: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a  then the value *
d220: 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
d230: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
d240: 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
d250: 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
d260: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
d270: 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
d280: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
d290: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
d2a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
d2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d2c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
d2d0: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
d2e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d2f0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
d300: 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
d310: 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f  e **ppPage     /
d320: 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
d330: 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
d340: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
d350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d360: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
d370: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 66 28  mutex) );..  if(
d380: 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
d390: 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
d3a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
d3b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
d3c0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  se{.    rc = btr
d3d0: 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
d3e0: 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b  gno, ppPage, 0);
d3f0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d400: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d410: 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
d420: 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
d430: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
d440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d450: 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
d460: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
d470: 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63    }.  }..  testc
d480: 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a  ase( pgno==0 );.
d490: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
d4a0: 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
d4b0: 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74  CORRUPT );.  ret
d4c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
d4d0: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
d4e0: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
d4f0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
d500: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
d510: 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47  * call to btreeG
d520: 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  etPage..*/.stati
d530: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
d540: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
d550: 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
d560: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d570: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
d580: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d590: 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73  ->pBt );.    ass
d5a0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
d5b0: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
d5c0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
d5d0: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20  id*)pPage );.   
d5e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d5f0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
d600: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
d610: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
d620: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d630: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
d640: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
d650: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
d660: 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e  gerUnref(pPage->
d670: 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a  pDbPage);.  }.}.
d680: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
d690: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
d6a0: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
d6b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
d6c0: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
d6d0: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
d6e0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
d6f0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
d700: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
d710: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
d720: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
d730: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
d740: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d750: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
d760: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
d770: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
d780: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
d790: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
d7a0: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
d7b0: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
d7c0: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
d7d0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
d7e0: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
d7f0: 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
d800: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
d810: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
d820: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
d830: 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
d840: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
d850: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
d860: 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
d870: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
d880: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d890: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
d8a0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
d8b0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
d8c0: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
d8d0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
d8e0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
d8f0: 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
d900: 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
d910: 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
d920: 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
d930: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
d940: 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
d950: 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
d960: 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
d970: 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
d980: 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
d990: 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
d9a0: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
d9b0: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
d9c0: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
d9d0: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
d9e0: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
d9f0: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
da00: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
da10: 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
da20: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
da30: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
da40: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
da50: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
da60: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
da70: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
da80: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
da90: 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
daa0: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
dab0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
dac0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
dad0: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
dae0: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
daf0: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
db00: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
db10: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
db20: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
db30: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
db40: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
db50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
db60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
db70: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
db80: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
db90: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
dba0: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
dbb0: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
dbc0: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
dbd0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
dbe0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
dbf0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
dc00: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
dc10: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
dc20: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
dc30: 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
dc40: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
dc50: 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
dc60: 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
dc70: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
dc80: 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
dc90: 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
dca0: 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
dcb0: 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
dcc0: 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
dcd0: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
dce0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
dcf0: 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
dd00: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
dd10: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
dd20: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
dd30: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
dd40: 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
dd50: 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
dd60: 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
dd70: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
dd80: 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
dd90: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
dda0: 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
ddb0: 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
ddc0: 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
ddd0: 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
dde0: 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
ddf0: 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
de00: 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
de10: 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
de20: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
de30: 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
de40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
de50: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
de60: 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
de70: 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
de80: 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
de90: 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
dea0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
deb0: 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
dec0: 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
ded0: 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
dee0: 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
def0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
df00: 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
df10: 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
df20: 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
df30: 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
df40: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
df50: 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
df60: 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
df70: 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
df80: 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
df90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
dfa0: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
dfb0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
dfc0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
dfd0: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
dfe0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
dff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
e000: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
e010: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
e020: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
e030: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
e040: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
e050: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
e060: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
e070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e080: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
e090: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
e0a0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
e0b0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
e0c0: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
e0d0: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
e0e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
e0f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
e100: 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
e110: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
e120: 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
e150: 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
e160: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
e170: 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
e180: 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
e190: 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
e1a0: 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
e1b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
e1c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
e1d0: 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
e1e0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
e1f0: 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
e200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e210: 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
e220: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
e230: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
e240: 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
e250: 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
e260: 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
e270: 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
e280: 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
e290: 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
e2a0: 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
e2b0: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
e2c0: 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
e2d0: 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
e2e0: 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
e2f0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
e300: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
e310: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
e320: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
e330: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
e340: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
e350: 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
e360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
e370: 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
e380: 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
e390: 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
e3a0: 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
e3b0: 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
e3c0: 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
e3d0: 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
e400: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
e410: 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
e440: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
e450: 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
e460: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
e470: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
e480: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e490: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
e4a0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
e4b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
e4c0: 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
e4d0: 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
e4e0: 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
e4f0: 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
e500: 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
e510: 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
e520: 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
e530: 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
e540: 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
e550: 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
e560: 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
e570: 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
e580: 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
e590: 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
e5a0: 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
e5b0: 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
e5c0: 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
e5d0: 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
e5e0: 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
e5f0: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
e600: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
e610: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
e620: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
e630: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
e640: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
e650: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
e660: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
e670: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
e680: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
e690: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
e6a0: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
e6b0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
e6c0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
e6d0: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
e6e0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
e6f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e700: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
e710: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
e720: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
e730: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e740: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
e750: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
e760: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
e770: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
e780: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
e790: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
e7a0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
e7b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
e7c0: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
e7d0: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
e7e0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
e7f0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
e800: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
e810: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
e820: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
e830: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
e840: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
e850: 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69  sTempDb==0 && (i
e860: 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66  sMemdb==0 || (vf
e870: 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  sFlags&SQLITE_OP
e880: 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20  EN_URI)!=0) ){. 
e890: 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20     if( vfsFlags 
e8a0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  & SQLITE_OPEN_SH
e8b0: 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20  AREDCACHE ){.   
e8c0: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
e8d0: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
e8e0: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
e8f0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
e900: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
e910: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
e920: 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  me);.      MUTEX
e930: 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
e940: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
e950: 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e 73  ed; ).      p->s
e960: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
e970: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
e980: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
e990: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
e9a0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e9b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
e9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e9d0: 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20   isMemdb ){.    
e9e0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c      memcpy(zFull
e9f0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e  Pathname, zFilen
ea00: 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
ea10: 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
ea20: 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
ea30: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
ea40: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
ea50: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
ea60: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
ea90: 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
eaa0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
eab0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
eac0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ead0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
eae0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
eaf0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
eb00: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
eb10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eb20: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
eb30: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
eb40: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
eb50: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
eb60: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
eb70: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
eb80: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
eb90: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
eba0: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
ebb0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
ebc0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
ebd0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
ebe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ebf0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
ec00: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
ec10: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
ec20: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
ec30: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
ec40: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
ec50: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
ec60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
ec70: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
ec80: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
ec90: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
eca0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
ecb0: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
ecc0: 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
ecd0: 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
ece0: 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
ecf0: 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
ed00: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
ed10: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
ed20: 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
ed30: 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
ed40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
ed50: 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
ed60: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
ed70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
ed80: 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
ed90: 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
eda0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
edb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
edc0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
edd0: 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
ede0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
edf0: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
ee00: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
ee10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ee20: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
ee40: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
ee60: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
ee70: 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
ee80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
ee90: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
eea0: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
eeb0: 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
eec0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
eed0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eee0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
eef0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
ef00: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
ef10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
ef20: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
ef30: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
ef40: 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
ef50: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
ef60: 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
ef70: 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
ef80: 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
ef90: 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
efa0: 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
efb0: 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
efc0: 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
efd0: 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
efe0: 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
eff0: 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
f000: 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
f010: 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
f020: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
f030: 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
f040: 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
f050: 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
f060: 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
f070: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
f080: 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
f090: 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
f0a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f0b0: 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
f0c0: 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
f0d0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
f0e0: 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
f0f0: 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
f100: 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
f110: 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
f120: 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
f130: 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
f140: 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
f150: 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
f160: 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
f170: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
f180: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
f190: 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (i64)==4 );.    
f1a0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f1b0: 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66  64)==8 || sizeof
f1c0: 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20  (u64)==4 );.    
f1d0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
f1e0: 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  32)==4 );.    as
f1f0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36  sert( sizeof(u16
f200: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65  )==2 );.    asse
f210: 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29  rt( sizeof(Pgno)
f220: 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42  ==4 );.  .    pB
f230: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
f240: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70  cZero( sizeof(*p
f250: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
f260: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  Bt==0 ){.      r
f270: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
f280: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
f290: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
f2a0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
f2b0: 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
f2c0: 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
f2d0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45        EXTRA_SIZE
f300: 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67  , flags, vfsFlag
f310: 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  s, pageReinit);.
f320: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
f330: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
f340: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f350: 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70  ReadFileheader(p
f360: 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f  Bt->pPager,sizeo
f370: 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62  f(zDbHeader),zDb
f380: 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Header);.    }. 
f390: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f3a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
f3b0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
f3c0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  t;.    }.    pBt
f3d0: 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75  ->openFlags = (u
f3e0: 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74  8)flags;.    pBt
f3f0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73  ->db = db;.    s
f400: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
f410: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
f420: 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
f430: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
f440: 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
f450: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42  = pBt;.  .    pB
f460: 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a  t->pCursor = 0;.
f470: 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
f480: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
f490: 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
f4a0: 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
f4b0: 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
f4c0: 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
f4d0: 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  Y;.#ifdef SQLITE
f4e0: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
f4f0: 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
f500: 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
f510: 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20  ELETE;.#endif.  
f520: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
f530: 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
f540: 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
f550: 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
f560: 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
f570: 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
f580: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
f590: 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
f5a0: 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
f5b0: 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
f5c0: 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
f5d0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
f5e0: 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
f5f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
f600: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
f610: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
f620: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
f630: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
f640: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
f650: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
f660: 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
f670: 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
f680: 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
f690: 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
f6a0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
f6b0: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
f6c0: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
f6d0: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
f6e0: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
f6f0: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
f700: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
f710: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
f720: 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
f730: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
f740: 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
f750: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
f760: 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
f770: 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
f780: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
f790: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
f7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
f7b0: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
f7c0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
f7d0: 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
f7e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
f7f0: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
f800: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
f810: 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
f820: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
f830: 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
f840: 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
f850: 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  e{.      nReserv
f860: 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
f870: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
f880: 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
f890: 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
f8a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f8b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f8c0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
f8d0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
f8e0: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
f8f0: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
f900: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f910: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
f920: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
f930: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
f940: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
f950: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
f960: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
f970: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
f980: 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
f990: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
f9a0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f9b0: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
f9c0: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
f9d0: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
f9e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
f9f0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
fa00: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
fa10: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
fa20: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
fa30: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
fa40: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
fa50: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
fa60: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
fa70: 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
fa80: 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
fa90: 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
faa0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
fab0: 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
fac0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
fad0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
fae0: 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
faf0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
fb00: 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
fb10: 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d       pBt->nRef =
fb20: 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   1;.      MUTEX_
fb30: 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72  LOGIC( mutexShar
fb40: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
fb50: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
fb60: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
fb70: 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53  R);).      if( S
fb80: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
fb90: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
fba0: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
fbb0: 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ex ){.        pB
fbc0: 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  t->mutex = sqlit
fbd0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
fbe0: 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
fbf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74  .        if( pBt
fc00: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
fc10: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
fc20: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
fc30: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
fc40: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  ailed = 0;.     
fc50: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
fc60: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
fc70: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fc80: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
fc90: 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
fca0: 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
fcb0: 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
fcc0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
fcd0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
fce0: 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
fcf0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
fd00: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
fd10: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
fd20: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
fd30: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
fd40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
fd50: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
fd60: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
fd70: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
fd80: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
fd90: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
fda0: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
fdb0: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
fdc0: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
fdd0: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
fde0: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
fdf0: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
fe00: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
fe10: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
fe20: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
fe30: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
fe40: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
fe50: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
fe60: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
fe70: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
fe80: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
fe90: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
fea0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
feb0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
fec0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
fed0: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
fee0: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
fef0: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
ff00: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
ff10: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
ff20: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
ff30: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
ff40: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
ff50: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
ff60: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
ff70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
ff80: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
ff90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ffa0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
ffb0: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
ffc0: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
ffd0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
ffe0: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
fff0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
10000 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
10010 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
10020 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
10030 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
10040 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
10050 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
10060 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
10070 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
10080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10090 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
100a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
100b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
100c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
100d0 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
100e0 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
100f0 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
10100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10110 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
10120 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
10130 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
10140 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
10150 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10160 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
10170 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
10180 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
10190 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
101a0 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65   /* If the B-Tre
101b0 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
101c0 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74  ly opened, set t
101d0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
101e0 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ize to the.    *
101f0 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  * default value.
10200 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70   Except, when op
10210 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73  ening on an exis
10220 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
10230 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20  r-cache,.    ** 
10240 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
10250 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
10260 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
10270 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  f( sqlite3BtreeS
10280 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d  chema(p, 0, 0)==
10290 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
102a0 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
102b0 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ize(p->pBt->pPag
102c0 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
102d0 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a  LT_CACHE_SIZE);.
102e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
102f0 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
10300 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10310 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
10320 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
10330 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
10340 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
10350 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10360 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
10370 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  t the BtShared.n
10380 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68  Ref counter.  Wh
10390 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65  en it reaches ze
103a0 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  ro,.** remove th
103b0 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  e BtShared struc
103c0 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68  ture from the sh
103d0 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74  aring list.  Ret
103e0 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74  urn.** true if t
103f0 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
10400 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73   counter reaches
10410 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
10420 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20  .** false if it 
10430 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76  is still positiv
10440 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10450 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
10460 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20  ngList(BtShared 
10470 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53  *pBt){.#ifndef S
10480 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10490 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f  D_CACHE.  MUTEX_
104a0 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
104b0 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
104c0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
104d0 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
104e0 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
104f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10500 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
10510 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c  ex) );.  MUTEX_L
10520 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
10530 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
10540 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
10550 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
10560 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
10570 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
10580 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a  .  pBt->nRef--;.
10590 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c    if( pBt->nRef<
105a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c  =0 ){.    if( GL
105b0 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
105c0 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
105d0 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20  eList)==pBt ){. 
105e0 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
105f0 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
10600 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
10610 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
10620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69  }else{.      pLi
10630 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  st = GLOBAL(BtSh
10640 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
10650 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
10660 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
10670 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69  YS(pList) && pLi
10680 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29  st->pNext!=pBt )
10690 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d  {.        pList=
106a0 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  pList->pNext;.  
106b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
106c0 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b  ALWAYS(pList) ){
106d0 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  .        pList->
106e0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65  pNext = pBt->pNe
106f0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
10700 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  }.    if( SQLITE
10710 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20  _THREADSAFE ){. 
10720 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10730 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74  ex_free(pBt->mut
10740 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ex);.    }.    r
10750 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  emoved = 1;.  }.
10760 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
10770 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a  leave(pMaster);.
10780 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64    return removed
10790 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
107a0 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   1;.#endif.}../*
107b0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42  .** Make sure pB
107c0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69  t->pTmpSpace poi
107d0 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61  nts to an alloca
107e0 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43  tion of .** MX_C
107f0 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79  ELL_SIZE(pBt) by
10800 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
10810 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
10820 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
10830 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
10840 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
10850 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
10860 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
10870 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
10880 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Size );.  }.}../
10890 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
108a0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
108b0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
108c0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
108d0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
108e0 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61  Bt){.  sqlite3Pa
108f0 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d  geFree( pBt->pTm
10900 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e  pSpace);.  pBt->
10910 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d  pTmpSpace = 0;.}
10920 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
10930 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
10940 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
10950 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
10960 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
10970 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
10980 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
10990 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
109a0 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
109b0 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
109c0 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
109d0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
109e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
109f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
10a00 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
10a10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10a20 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
10a30 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
10a40 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
10a50 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
10a60 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
10a70 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
10a80 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
10a90 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
10aa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
10ab0 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
10ac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10ad0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
10ae0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
10af0 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
10b00 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
10b10 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
10b20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
10b30 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
10b40 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
10b50 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
10b60 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
10b70 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10b80 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  ck(p, SQLITE_OK)
10b90 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10ba0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
10bb0 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
10bc0 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
10bd0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
10be0 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
10bf0 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
10c00 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
10c10 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
10c20 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
10c30 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
10c40 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
10c50 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
10c60 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
10c70 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
10c80 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
10c90 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
10ca0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
10cb0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
10cc0 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
10cd0 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
10ce0 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
10cf0 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
10d00 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
10d10 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
10d20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
10d30 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
10d40 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
10d50 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
10d60 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
10d70 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
10d80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
10d90 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
10da0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
10db0 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
10dc0 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
10dd0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
10de0 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
10df0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
10e00 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
10e10 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
10e20 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
10e30 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
10e40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
10e50 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
10e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
10e70 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
10e80 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
10e90 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
10ea0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
10eb0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
10ec0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
10ed0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
10ee0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
10ef0 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
10f00 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
10f10 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
10f20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
10f30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10f40 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
10f50 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
10f60 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
10f70 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
10f80 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
10f90 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
10fa0 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
10fb0 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
10fc0 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
10fd0 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
10fe0 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
10ff0 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
11000 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
11010 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
11020 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
11030 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
11040 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
11050 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
11060 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
11070 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
11080 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
11090 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
110a0 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
110b0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
110c0 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
110d0 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
110e0 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
110f0 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
11100 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
11110 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
11120 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
11130 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
11140 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
11150 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
11160 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
11170 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
11180 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
11190 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
111a0 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
111b0 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
111c0 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
111d0 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
111e0 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
111f0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
11200 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
11210 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
11220 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
11230 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11240 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
11250 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11260 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
11270 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11280 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
11290 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
112a0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
112b0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
112c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
112d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
112e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
112f0 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
11300 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
11310 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
11320 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
11330 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
11340 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
11350 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
11360 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
11370 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
11380 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
11390 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
113a0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
113b0 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
113c0 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
113d0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
113e0 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
113f0 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
11400 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
11410 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
11420 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
11430 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
11440 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
11450 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
11460 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
11470 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
11480 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
11490 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
114a0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
114b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
114c0 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
114d0 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
114e0 65 74 79 4c 65 76 65 6c 28 0a 20 20 42 74 72 65  etyLevel(.  Btre
114f0 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
11500 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11510 74 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74  to set the safet
11520 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20  y level on */.  
11530 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20 20 20 20  int level,      
11540 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
11550 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e 20 20 31   synchronous.  1
11560 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41 4c 2c 20  =OFF, 2=NORMAL, 
11570 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  3=FULL */.  int 
11580 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20 20 20 20  fullSync,       
11590 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 66 75 6c     /* PRAGMA ful
115a0 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20 69 6e 74  lfsync. */.  int
115b0 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63 20 20 20   ckptFullSync   
115c0 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20 63 68      /* PRAGMA ch
115d0 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c 66 79 6e  eckpoint_fullfyn
115e0 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  c */.){.  BtShar
115f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
11600 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11610 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11620 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
11630 20 20 61 73 73 65 72 74 28 20 6c 65 76 65 6c 3e    assert( level>
11640 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d 33 20 29  =1 && level<=3 )
11650 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
11660 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
11670 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
11680 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
11690 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53  er, level, fullS
116a0 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c 53 79 6e  ync, ckptFullSyn
116b0 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
116c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
116d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
116e0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
116f0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11700 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
11710 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
11720 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
11730 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
11740 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
11750 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
11760 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
11770 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
11780 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
11790 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
117a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
117b0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
117c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
117d0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
117e0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
117f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11800 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
11810 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
11820 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
11830 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
11840 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
11850 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11860 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11870 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  rc;.}../*.** Cha
11880 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
11890 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
118a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
118b0 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
118c0 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
118d0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
118e0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
118f0 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
11900 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
11910 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
11920 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
11930 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
11940 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
11950 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
11960 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
11970 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
11980 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
11990 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
119a0 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
119b0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
119c0 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
119d0 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
119e0 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
119f0 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
11a00 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
11a10 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
11a20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
11a30 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
11a40 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
11a50 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
11a60 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
11a70 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
11a80 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
11a90 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
11aa0 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
11ab0 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
11ac0 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
11ad0 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
11ae0 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
11af0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
11b00 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
11b10 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
11b20 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
11b30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
11b40 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
11b50 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
11b60 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
11b70 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
11b80 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
11b90 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
11ba0 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
11bb0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
11bc0 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
11bd0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
11be0 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
11bf0 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
11c00 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
11c10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
11c20 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
11c30 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
11c40 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
11c50 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
11c60 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
11c70 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
11c80 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
11c90 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
11ca0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
11cb0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
11cc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
11cd0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
11ce0 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
11cf0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
11d00 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
11d10 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
11d20 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
11d30 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
11d40 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
11d50 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
11d60 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
11d70 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
11d80 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
11d90 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
11da0 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
11db0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
11dc0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
11dd0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
11de0 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
11df0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
11e00 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
11e10 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
11e20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
11e30 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
11e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11e50 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
11e60 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
11e70 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
11e80 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
11e90 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
11ea0 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
11eb0 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
11ec0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
11ed0 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
11ee0 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
11ef0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11f00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11f10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
11f20 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
11f30 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
11f40 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
11f50 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
11f60 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
11f70 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
11f80 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
11f90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
11fa0 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
11fb0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11fc0 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a  IT_VACUUM)./*.**
11fd0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
11fe0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
11ff0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
12000 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68  of every page th
12010 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74  at.** are intent
12020 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65  ually left unuse
12030 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
12040 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65  "reserved" space
12050 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65   that is.** some
12060 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78  times used by ex
12070 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  tensions..*/.int
12080 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
12090 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
120a0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
120b0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
120c0 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
120d0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
120e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
120f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12100 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12110 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
12120 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
12130 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
12140 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
12150 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
12160 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
12170 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
12180 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
12190 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
121a0 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
121b0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
121c0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
121d0 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
121e0 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
121f0 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
12200 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
12210 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
12220 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
12230 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
12240 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
12250 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
12260 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
12270 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
12280 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
12290 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f  .** Set the BTS_
122a0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c  SECURE_DELETE fl
122b0 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73  ag if newFlag is
122c0 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77   0 or 1.  If new
122d0 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74  Flag is -1,.** t
122e0 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e  hen make no chan
122f0 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74  ges.  Always ret
12300 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
12310 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f   the BTS_SECURE_
12320 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e  DELETE.** settin
12330 67 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  g after the chan
12340 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
12350 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
12360 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
12370 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
12380 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
12390 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
123a0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
123b0 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61  p);.  if( newFla
123c0 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
123d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
123e0 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  ~BTS_SECURE_DELE
123f0 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46  TE;.    if( newF
12400 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74  lag ) p->pBt->bt
12410 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
12420 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  CURE_DELETE;.  }
12430 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d   .  b = (p->pBt-
12440 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
12450 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d  SECURE_DELETE)!=
12460 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
12470 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
12480 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn b;.}.#endif 
12490 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
124a0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
124b0 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
124c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
124d0 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
124e0 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
124f0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
12500 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
12510 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
12520 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
12530 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
12540 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
12550 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
12560 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
12570 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
12580 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
12590 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
125a0 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
125b0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
125c0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
125d0 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
125e0 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
125f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
12600 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
12610 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
12620 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
12630 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12640 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
12650 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
12660 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
12670 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
12680 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12690 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
126a0 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
126b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
126c0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
126d0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
126e0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
126f0 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
12700 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
12710 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
12720 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
12740 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
12750 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
12760 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
12770 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
12780 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12790 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
127a0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
127b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
127c0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
127d0 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
127e0 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
127f0 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
12800 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
12810 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
12820 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12830 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
12840 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
12850 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
12860 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
12870 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
12880 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
12890 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
128a0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
128b0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
128c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
128d0 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
128e0 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
128f0 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
12900 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
12910 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
12920 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
12930 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
12940 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
12960 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
12970 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
12980 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
12990 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
129a0 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
129b0 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
129c0 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
129d0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
129e0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
129f0 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
12a00 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
12a10 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
12a20 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
12a30 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
12a40 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
12a50 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
12a60 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
12a70 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
12a80 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
12a90 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
12aa0 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
12ab0 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
12ac0 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
12ad0 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
12ae0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
12af0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12b00 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
12b10 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
12b20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
12b30 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
12b40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12b50 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
12b60 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
12b70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
12b80 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
12b90 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
12ba0 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
12bb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
12bc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
12bd0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
12be0 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
12bf0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
12c00 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
12c10 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
12c20 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
12c30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
12c40 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
12c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
12c60 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
12c70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12c80 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
12c90 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
12ca0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12cb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
12cc0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
12cd0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
12ce0 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
12cf0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12d00 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
12d10 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
12d20 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
12d30 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
12d40 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
12d50 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
12d60 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
12d70 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
12d80 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
12d90 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
12da0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12db0 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
12dc0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
12dd0 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
12de0 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
12df0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12e00 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
12e10 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
12e20 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
12e30 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
12e40 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
12e50 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
12e60 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
12e70 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
12e80 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
12e90 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
12ea0 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
12eb0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
12ec0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
12ed0 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
12ee0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12ef0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12f00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12f10 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
12f20 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
12f30 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
12f40 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
12f50 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
12f60 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
12f70 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
12f80 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
12f90 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
12fa0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
12fb0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
12fc0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
12fd0 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
12fe0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
12ff0 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
13000 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13010 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
13020 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
13030 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
13040 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
13050 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
13060 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
13070 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
13080 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
13090 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
130a0 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
130b0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
130c0 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
130d0 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
130e0 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
130f0 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
13100 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
13110 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
13120 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
13130 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
13140 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
13150 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
13160 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
13170 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
13180 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
13190 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
131a0 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
131b0 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
131c0 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
131d0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
131e0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
131f0 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
13200 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
13210 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
13220 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
13230 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13240 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
13250 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
13260 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
13270 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13280 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
13290 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
132a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
132b0 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66  isOpen==0 ){.#if
132c0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
132d0 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56  LT_WAL_SAFETYLEV
132e0 45 4c 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65  EL.        /* De
132f0 66 61 75 6c 74 20 74 6f 20 73 70 65 63 69 66 69  fault to specifi
13300 65 64 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  ed safety_level 
13310 66 6f 72 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  for WAL mode */.
13320 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
13330 3e 64 62 21 3d 30 20 26 26 20 70 42 74 2d 3e 64  >db!=0 && pBt->d
13340 62 2d 3e 61 44 62 21 3d 30 20 29 7b 0a 20 20 20  b->aDb!=0 ){.   
13350 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
13360 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13370 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b  3 *db = pBt->db;
13380 0a 20 20 20 20 20 20 20 20 20 20 44 62 20 2a 61  .          Db *a
13390 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
133a0 20 20 20 20 20 20 20 20 75 38 20 6c 65 76 65 6c          u8 level
133b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
133c0 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64  for(iDb=0; iDb<d
133d0 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a  b->nDb; iDb++){.
133e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
133f0 61 44 62 5b 69 44 62 5d 2e 70 42 74 20 26 26 20  aDb[iDb].pBt && 
13400 61 44 62 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42  aDb[iDb].pBt->pB
13410 74 3d 3d 70 42 74 20 29 20 62 72 65 61 6b 3b 0a  t==pBt ) break;.
13420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13430 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
13440 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
13450 20 20 20 20 20 20 20 6c 65 76 65 6c 20 3d 20 64         level = d
13460 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61 66 65  b->aDb[iDb].safe
13470 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20  ty_level;.      
13480 20 20 20 20 69 66 28 20 21 53 51 4c 49 54 45 5f      if( !SQLITE_
13490 44 62 53 61 66 65 74 79 4c 65 76 65 6c 49 73 46  DbSafetyLevelIsF
134a0 69 78 65 64 28 6c 65 76 65 6c 29 20 26 26 20 0a  ixed(level) && .
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
134c0 4c 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76  LITE_DbSafetyLev
134d0 65 6c 56 61 6c 75 65 28 6c 65 76 65 6c 29 20 21  elValue(level) !
134e0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
134f0 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c  _WAL_SAFETYLEVEL
13500 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
13510 20 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79   aDb[iDb].safety
13520 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f  _level = SQLITE_
13530 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45  DEFAULT_WAL_SAFE
13540 54 59 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20  TYLEVEL;.       
13550 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
13560 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
13570 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
13580 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
13590 53 41 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20  SAFETYLEVEL, .  
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135c0 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26       (db->flags&
135d0 53 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63  SQLITE_FullFSync
135e0 29 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20  )!=0,.          
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62               (db
13610 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43  ->flags&SQLITE_C
13620 6b 70 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30  kptFullFSync)!=0
13630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
13640 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
13650 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
13660 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
13670 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13680 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
13690 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
136a0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
136b0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
136c0 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
136d0 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
136e0 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
136f0 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
13700 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
13710 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
13720 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
13730 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
13740 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
13750 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
13760 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
13770 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
13780 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
13790 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
137a0 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
137b0 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
137c0 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
137d0 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
137e0 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
137f0 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
13800 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13810 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13820 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
13830 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38   = (page1[16]<<8
13840 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c  ) | (page1[17]<<
13850 31 36 29 3b 0a 20 20 20 20 69 66 28 20 28 28 70  16);.    if( ((p
13860 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
13870 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
13880 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
13890 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
138a0 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
138b0 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
138c0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
138d0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
138e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
138f0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
13900 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65  ;.    usableSize
13910 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61   = pageSize - pa
13920 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28  ge1[20];.    if(
13930 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d   (u32)pageSize!=
13940 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
13950 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
13960 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
13970 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
13980 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
13990 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
139a0 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
139b0 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
139c0 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
139d0 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
139e0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
139f0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
13a00 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
13a10 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
13a20 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
13a30 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
13a40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
13a50 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
13a60 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
13a70 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
13a80 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
13a90 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
13aa0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
13ab0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13ac0 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
13ad0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
13ae0 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
13af0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
13b00 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
13b10 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
13b20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13b30 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
13b40 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
13b50 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
13b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b80 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
13b90 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
13ba0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
13bb0 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
13bc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
13bd0 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20  ecoveryMode)==0 
13be0 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69  && nPage>nPageFi
13bf0 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  le ){.      rc =
13c00 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13c10 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
13c20 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
13c30 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
13c40 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30  ( usableSize<480
13c50 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
13c60 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
13c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
13c80 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
13c90 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
13ca0 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
13cb0 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
13cc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13cd0 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
13ce0 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
13cf0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
13d00 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
13d10 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13d20 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13d30 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
13d40 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
13d50 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
13d60 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
13d70 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
13d80 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
13d90 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
13da0 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
13db0 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
13dc0 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
13dd0 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
13de0 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
13df0 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
13e00 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
13e10 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
13e20 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
13e30 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
13e40 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
13e50 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
13e60 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
13e70 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
13e80 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
13e90 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
13ea0 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
13eb0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
13ec0 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
13ed0 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
13ee0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
13ef0 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
13f00 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
13f10 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61  -byte pointer, a
13f20 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
13f30 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
13f40 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
13f50 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
13f60 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
13f70 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
13f80 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
13f90 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
13fa0 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
13fb0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
13fc0 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34  sableSize-12)*64
13fd0 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
13fe0 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75  t->minLocal = (u
13ff0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
14000 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20  Size-12)*32/255 
14010 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61  - 23);.  pBt->ma
14020 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28 70 42  xLeaf = (u16)(pB
14030 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
14040 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  35);.  pBt->minL
14050 65 61 66 20 3d 20 28 75 31 36 29 28 28 70 42 74  eaf = (u16)((pBt
14060 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
14070 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *32/255 - 23);. 
14080 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63   if( pBt->maxLoc
14090 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42  al>127 ){.    pB
140a0 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
140b0 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73  ad = 127;.  }els
140c0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  e{.    pBt->max1
140d0 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75  bytePayload = (u
140e0 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  8)pBt->maxLocal;
140f0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
14100 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
14110 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
14120 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
14130 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
14140 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
14150 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20  nPage;.  return 
14160 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
14170 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
14180 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
14190 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
141a0 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
141b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
141c0 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  f there are no o
141d0 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
141e0 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f  rs and we are no
141f0 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a  t in the middle.
14200 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  ** of a transact
14210 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73  ion but there is
14220 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
14230 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  the database, th
14240 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
14250 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69  ne unrefs the fi
14260 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
14270 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
14280 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20  ich .** has the 
14290 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73  effect of releas
142a0 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ing the read loc
142b0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  k..**.** If ther
142c0 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
142d0 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
142e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
142f0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
14300 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
14310 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
14320 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
14330 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14340 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
14350 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
14360 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
14370 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
14380 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
14390 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
143a0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
143b0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
143c0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
143d0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
143e0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
143f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
14400 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
14410 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
14420 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
14430 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
14440 44 61 74 61 20 29 3b 0a 20 20 20 20 72 65 6c 65  Data );.    rele
14450 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
14460 67 65 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge1);.    pBt->p
14470 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Page1 = 0;.  }.}
14480 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
14490 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
144a0 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
144b0 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
144c0 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
144d0 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
144e0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
144f0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
14500 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
14510 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
14520 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
14530 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
14540 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
14550 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
14560 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
14570 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14580 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
14590 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
145a0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
145b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
145c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
145d0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
145e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
145f0 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
14600 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
14610 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
14620 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
14630 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
14640 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
14650 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
14660 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
14670 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
14680 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
14690 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
146a0 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
146b0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
146c0 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
146d0 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
146e0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
146f0 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
14700 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
14710 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
14720 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
14730 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
14740 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
14750 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
14760 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
14770 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
14780 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
14790 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
147a0 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
147b0 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
147c0 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
147d0 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
147e0 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
147f0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
14800 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
14810 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
14820 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
14830 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
14840 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
14850 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14860 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
14870 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
14880 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
14890 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
148a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
148b0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
148c0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
148d0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
148e0 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
148f0 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
14900 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
14910 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
14920 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
14930 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
14940 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
14950 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
14960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
14980 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
14990 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
149a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
149b0 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
149c0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
149d0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
149e0 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
149f0 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
14a00 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
14a10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
14a20 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
14a30 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
14a40 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
14a50 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
14a60 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
14a70 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
14a80 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
14a90 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
14aa0 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
14ab0 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
14ac0 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
14ad0 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
14ae0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
14af0 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
14b00 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
14b10 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
14b20 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
14b30 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
14b40 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
14b50 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
14b60 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
14b70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
14b80 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
14b90 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
14ba0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
14bb0 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
14bc0 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
14bd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
14be0 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
14bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14c00 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
14c10 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14c20 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
14c30 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
14c40 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
14c50 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14c60 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
14c70 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14c80 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
14c90 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14ca0 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
14cb0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14cc0 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
14cd0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
14ce0 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
14cf0 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
14d00 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
14d10 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
14d20 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
14d30 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
14d40 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
14d50 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
14d60 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
14d70 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
14d80 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
14d90 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
14da0 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
14db0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
14dc0 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
14dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14de0 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
14df0 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
14e00 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
14e10 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
14e20 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
14e30 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
14e40 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
14e50 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
14e60 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
14e70 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
14e80 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
14e90 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
14ea0 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
14eb0 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
14ec0 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
14ed0 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
14ee0 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
14ef0 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
14f00 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
14f10 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
14f20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
14f30 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
14f40 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
14f50 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
14f60 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
14f70 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
14f80 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
14f90 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
14fa0 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
14fb0 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
14fc0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
14fd0 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
14fe0 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
14ff0 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
15000 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
15010 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
15020 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
15030 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
15040 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
15050 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
15060 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15070 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15080 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
15090 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
150a0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
150b0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
150c0 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
150d0 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
150e0 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
150f0 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
15100 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
15110 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
15120 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
15130 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
15140 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
15150 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
15160 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
15170 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
15180 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
15190 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
151a0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
151b0 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  un;.  }..  /* Wr
151c0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
151d0 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
151e0 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
151f0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
15200 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
15210 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
15220 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
15230 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
15240 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
15250 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
15260 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
15270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15280 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66  ED_CACHE.  /* If
15290 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
152a0 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
152b0 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
152c0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
152d0 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
152e0 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
152f0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
15300 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
15310 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
15320 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
15330 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a  LITE_LOCKED..  *
15340 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20  /.  if( (wrflag 
15350 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
15360 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
15370 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e  TE).   || (pBt->
15380 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
15390 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a  ENDING)!=0.  ){.
153a0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
153b0 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
153c0 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
153d0 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
153e0 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
153f0 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
15400 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
15410 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
15420 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
15430 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
15440 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
15450 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
15460 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
15470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15480 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
15490 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
154a0 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
154b0 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
154c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
154d0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
154e0 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
154f0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
15500 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
15510 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
15520 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
15530 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
15540 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
15550 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
15560 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
15570 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
15580 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
15590 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
155a0 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
155b0 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
155c0 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
155d0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
155e0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
155f0 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
15600 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
15610 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
15620 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
15630 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ..  pBt->btsFlag
15640 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41  s &= ~BTS_INITIA
15650 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28  LLY_EMPTY;.  if(
15660 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29   pBt->nPage==0 )
15670 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
15680 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  = BTS_INITIALLY_
15690 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20  EMPTY;.  do {.  
156a0 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
156b0 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
156c0 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
156d0 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
156e0 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
156f0 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
15700 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
15710 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
15720 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
15730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15740 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
15750 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
15760 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
15770 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
15780 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
15790 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
157a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
157b0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
157c0 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
157d0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
157e0 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
157f0 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
15800 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
15810 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
15820 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
15830 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
15840 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
15850 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
15860 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
15870 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
15880 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15890 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
158a0 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62       if( (pBt->b
158b0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
158c0 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  AD_ONLY)!=0 ){. 
158d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
158e0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
158f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15910 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
15920 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
15930 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
15940 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
15950 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15960 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15970 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
15980 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
15990 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
159a0 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
159b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
159c0 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
159d0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
159e0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63   }.  }while( (rc
159f0 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xFF)==SQLITE_B
15a00 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
15a10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15a20 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
15a30 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
15a40 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
15a50 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
15a60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
15a70 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
15a80 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
15a90 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
15aa0 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
15ab0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
15ac0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
15ad0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
15ae0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
15af0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
15b00 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
15b10 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
15b20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
15b30 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
15b40 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
15b50 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
15b60 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
15b70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
15b80 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
15b90 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
15ba0 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
15bb0 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
15bc0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
15bd0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
15be0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
15bf0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
15c00 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
15c10 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
15c20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
15c30 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
15c40 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
15c50 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
15c60 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15c70 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
15c80 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
15c90 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
15ca0 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
15cb0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
15cc0 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
15cd0 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
15ce0 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
15cf0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
15d00 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
15d10 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
15d20 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
15d30 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
15d40 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
15d50 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
15d60 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
15d70 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
15d80 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
15d90 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
15da0 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
15db0 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
15dc0 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
15dd0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
15de0 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
15df0 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
15e00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
15e10 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
15e20 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
15e30 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
15e40 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
15e50 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
15e60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
15e70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
15e80 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
15e90 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
15ea0 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
15eb0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
15ec0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
15ed0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
15ee0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
15ef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15f00 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
15f10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
15f20 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
15f30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61  .    }.  }...tra
15f50 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
15f60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15f70 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f   wrflag ){.    /
15f80 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
15f90 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
15fa0 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
15fb0 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
15fc0 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
15fd0 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
15fe0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
15ff0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
16000 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65  0 and.    ** the
16010 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
16020 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
16030 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
16040 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
16050 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
16060 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
16070 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
16080 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
16090 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20  vepoint);.  }.. 
160a0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
160b0 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
160c0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
160d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
160e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
160f0 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
16100 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
16110 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
16120 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
16130 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
16140 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
16150 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
16160 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
16170 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
16180 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
16190 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
161a0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
161b0 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
161c0 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
161d0 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
161e0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
161f0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
16220 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
16230 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
16240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
16250 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
16260 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
16270 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
162a0 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
162b0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
162c0 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
162d0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
162e0 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
162f0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
16300 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
16310 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16320 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
16330 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
16340 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
16350 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
16360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
16370 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
16380 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
16390 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
163a0 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
163b0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
163c0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
163d0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
163e0 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
163f0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
16400 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
16410 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
16420 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
16430 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
16440 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
16450 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
16460 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
16470 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
16480 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
16490 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
164a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
164b0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
164c0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
164d0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
164e0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
164f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
16500 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
16510 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
16520 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  c);.  }..set_chi
16530 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
16540 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
16550 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
16560 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16570 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
16580 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
16590 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
165a0 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
165b0 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
165c0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
165d0 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
165e0 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
165f0 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
16600 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
16610 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
16620 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
16630 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
16640 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
16650 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
16660 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
16670 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
16680 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
16690 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
166a0 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
166b0 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
166c0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
166d0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
166e0 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
166f0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
16700 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
16710 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
16720 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
16730 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
16740 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
16750 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
16760 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
16770 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
16780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16790 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
167a0 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
167b0 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
167c0 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
167d0 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
167e0 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
167f0 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
16800 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16810 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
16820 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
16830 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16840 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
16850 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
16860 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
16870 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
16880 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
16890 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
168a0 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
168b0 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
168c0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
168d0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
168e0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
168f0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
16900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
16910 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
16920 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
16930 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
16940 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
16950 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
16960 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
16970 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
16980 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62  nt nCell;..    b
16990 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
169a0 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ge);.    nCell =
169b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
169c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
169d0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
169e0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
169f0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
16a00 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
16a10 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
16a20 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
16a30 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
16a40 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
16a50 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
16a60 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
16a70 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
16a80 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  Overflow.       
16a90 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
16aa0 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61  iOverflow+3<=pPa
16ab0 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
16ac0 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20  >maskPage.      
16ad0 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74     && iFrom==get
16ae0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
16af0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20  o.iOverflow]).  
16b00 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16b10 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
16b20 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
16b30 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
16b40 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16b50 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16b60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
16b70 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
16b80 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
16b90 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
16ba0 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
16bb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
16bc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16bd0 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
16be0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
16bf0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
16c00 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
16c10 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
16c20 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
16c30 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
16c40 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
16c50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16c60 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
16c70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
16c80 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
16c90 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
16ca0 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
16cb0 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
16cc0 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
16cd0 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
16ce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16cf0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
16d00 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
16d10 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
16d20 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
16d30 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
16d40 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
16d50 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
16d60 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
16d70 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
16d80 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
16d90 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
16da0 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
16db0 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
16dc0 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
16dd0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
16de0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
16df0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
16e00 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
16e10 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
16e20 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
16e30 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
16e40 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
16e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
16e60 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
16e70 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
16e80 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
16e90 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
16ea0 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
16eb0 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
16ec0 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
16ed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16ee0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
16ef0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
16f00 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
16f10 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
16f20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
16f30 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
16f40 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
16f50 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
16f60 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
16f70 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
16f80 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
16f90 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
16fa0 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
16fb0 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
16fc0 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
16fd0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
16fe0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
16ff0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
17000 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
17010 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
17020 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
17030 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
17040 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
17050 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
17060 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
17070 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
17080 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
17090 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
170a0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
170b0 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
170c0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
170d0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
170e0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
170f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17100 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17110 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
17120 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
17130 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
17140 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
17150 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
17160 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
17170 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
17180 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
17190 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
171a0 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
171b0 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
171c0 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
171d0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
171e0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
171f0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
17200 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17210 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
17220 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
17230 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
17240 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
17250 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17260 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17270 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
17280 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
17290 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
172a0 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
172b0 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
172c0 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
172d0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
172e0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
172f0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
17300 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
17310 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
17320 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
17330 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
17340 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
17350 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
17360 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
17370 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
17380 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
17390 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
173a0 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
173b0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
173c0 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
173d0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
173e0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
173f0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
17400 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
17410 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
17420 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
17430 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
17440 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
17450 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
17460 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
17470 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
17480 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
17490 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
174a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
174b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
174c0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
174d0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
174e0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
174f0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
17500 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
17510 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
17520 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
17530 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
17540 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
17550 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17560 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17570 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
17580 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
17590 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
175a0 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
175b0 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
175c0 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
175d0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
175e0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
175f0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
17600 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
17610 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
17620 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
17630 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
17640 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
17650 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
17660 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
17670 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
17680 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17690 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
176a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
176b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
176c0 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
176d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
176e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
176f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
17700 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
17710 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
17720 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17730 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
17740 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
17750 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
17760 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
17770 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
17780 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
17790 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
177a0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
177b0 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
177c0 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
177d0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
177e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
177f0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
17800 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
17810 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
17820 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
17830 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
17840 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
17850 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
17860 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
17870 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
17880 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
17890 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
178a0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
178b0 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
178c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
178d0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
178e0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
178f0 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
17900 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
17910 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
17920 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
17930 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
17940 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
17950 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
17960 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
17970 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
17980 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
17990 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
179a0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
179b0 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
179c0 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
179d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
179e0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
179f0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
17a00 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a  nction assumes.*
17a10 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  * that the calle
17a20 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
17a30 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
17a40 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74  ep() until.** it
17a50 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
17a60 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72  DONE or an error
17a70 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20  , and that nFin 
17a80 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
17a90 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61   of pages the da
17aa0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
17ab0 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74   contain after t
17ac0 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20  his .** process 
17ad0 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66  is complete.  If
17ae0 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69   nFin is zero, i
17af0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
17b00 74 0a 2a 2a 20 69 6e 63 72 56 61 63 75 75 6d 53  t.** incrVacuumS
17b10 74 65 70 28 29 20 77 69 6c 6c 20 62 65 20 63 61  tep() will be ca
17b20 6c 6c 65 64 20 61 20 66 69 6e 69 74 65 20 61 6d  lled a finite am
17b30 6f 75 6e 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a  ount of times.**
17b40 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
17b50 79 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 65 20  y not empty the 
17b60 66 72 65 65 6c 69 73 74 2e 20 20 41 20 66 75 6c  freelist.  A ful
17b70 6c 20 61 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20  l autovacuum.** 
17b80 68 61 73 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22  has nFin>0.  A "
17b90 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74  PRAGMA increment
17ba0 61 6c 5f 76 61 63 75 75 6d 22 20 68 61 73 20 6e  al_vacuum" has n
17bb0 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69  Fin==0..*/.stati
17bc0 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
17bd0 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
17be0 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
17bf0 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20  gno iLastPg){.  
17c00 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
17c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
17c20 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
17c30 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
17c40 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
17c50 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17c60 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17c70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
17c80 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
17c90 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
17ca0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
17cb0 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
17cc0 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
17cd0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
17ce0 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
17cf0 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
17d00 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
17d10 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
17d20 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
17d30 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
17d40 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
17d50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17d60 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
17d70 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
17d80 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
17d90 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
17da0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
17db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17dc0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17dd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
17de0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
17df0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
17e00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
17e10 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
17e20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
17e30 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
17e40 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e  {.      if( nFin
17e50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
17e60 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
17e70 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
17e80 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
17e90 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
17ea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e  .        ** if n
17eb0 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  Fin is non-zero.
17ec0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
17ed0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
17ee0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
17ef0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
17f00 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
17f10 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
17f20 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
17f30 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
17f40 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
17f50 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
17f60 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
17f70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
17f80 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
17f90 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
17fa0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
17fb0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
17fc0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
17fd0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
17fe0 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20  astPg, 1);.     
17ff0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18000 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
18030 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
18040 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
18050 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18060 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
18070 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
18080 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
18090 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
180a0 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
180b0 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
180c0 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
180d0 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
180e0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ;..      rc = bt
180f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18100 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
18110 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
18120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18130 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
18140 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
18150 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69      /* If nFin i
18160 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
18170 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
18180 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
18190 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
181a0 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
181b0 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
181c0 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
181d0 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
181e0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
181f0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
18200 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61   if nFin is grea
18210 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
18220 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
18230 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
18240 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
18250 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
18260 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
18270 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
18280 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
18290 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f       */.      do
182a0 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
182b0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
182c0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
182d0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
182e0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
182f0 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ePg, 0, 0);.    
18300 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18320 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18330 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
18340 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18360 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
18370 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
18380 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69  le( nFin!=0 && i
18390 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
183a0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
183b0 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
183c0 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
183d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
183e0 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62  ite(pLastPg->pDb
183f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
18400 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18410 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
18420 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
18430 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
18440 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
18450 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20  Pg, nFin!=0);.  
18460 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
18470 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
18480 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
184a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
184b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
184c0 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30  }..  if( nFin==0
184d0 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d   ){.    iLastPg-
184e0 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  -;.    while( iL
184f0 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
18500 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
18510 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
18520 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
18530 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
18540 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
18550 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  Pg) ){.        M
18560 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20  emPage *pPg;.   
18570 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
18580 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
18590 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  tPg, &pPg, 0);. 
185a0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
185b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
185c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
185d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
185e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
185f0 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
18600 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
18610 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
18620 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18640 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18650 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
18660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61       }.      iLa
18670 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  stPg--;.    }.  
18680 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
18690 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
186a0 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67  >pPager, iLastPg
186b0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  );.    pBt->nPag
186c0 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
186d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
186e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
186f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
18700 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
18710 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
18720 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
18730 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
18740 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
18750 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
18760 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
18770 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
18780 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
18790 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
187a0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
187b0 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
187c0 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
187d0 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
187e0 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
187f0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
18800 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  rred,.** SQLITE_
18810 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
18820 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
18830 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
18840 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18850 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
18860 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
18870 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
18880 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
18890 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
188a0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
188b0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
188c0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
188d0 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
188e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
188f0 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56   if( !pBt->autoV
18900 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
18910 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
18920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61   }else{.    inva
18930 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
18940 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
18950 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
18960 53 74 65 70 28 70 42 74 2c 20 30 2c 20 62 74 72  Step(pBt, 0, btr
18970 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
18980 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
18990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
189a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
189b0 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
189c0 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
189d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
189e0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
189f0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
18a00 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
18a10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18a20 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18a30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
18a40 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
18a50 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
18a60 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
18a70 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
18a80 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65  on.** is commite
18a90 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
18aa0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
18ab0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
18ac0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
18ad0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
18ae0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
18af0 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
18b00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18b10 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
18b20 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
18b30 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
18b40 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
18b50 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
18b60 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
18b70 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
18b80 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
18b90 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
18ba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18bb0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
18bc0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
18bd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18be0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
18bf0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
18c00 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
18c10 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
18c20 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
18c30 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
18c40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18c50 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18c60 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
18c70 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
18c80 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
18c90 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
18ca0 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
18cb0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
18cc0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
18cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
18ce0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
18cf0 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
18d00 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
18d10 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
18d20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18d30 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
18d40 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
18d50 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ly */.    Pgno n
18d60 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
18d70 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
18d80 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
18d90 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ed */.    Pgno i
18da0 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
18db0 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
18dc0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
18dd0 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
18de0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
18df0 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
18e00 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
18e10 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
18e20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
18e30 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
18e40 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
18e50 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
18e60 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
18e70 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
18e80 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
18e90 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
18ea0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
18eb0 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
18ec0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
18ed0 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
18ee0 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
18ef0 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
18f00 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
18f10 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
18f20 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
18f30 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
18f40 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
18f50 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
18f60 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
18f70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
18f80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18f90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18fa0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
18fb0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
18fc0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
18fd0 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72  [36]);.    nEntr
18fe0 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
18ff0 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d  ize/5;.    nPtrm
19000 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
19010 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
19020 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
19030 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20  ry)/nEntry;.    
19040 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
19050 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
19060 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45      if( nOrig>PE
19070 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
19080 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
19090 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
190a0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
190b0 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n--;.    }.    w
190c0 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
190d0 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
190e0 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
190f0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
19100 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
19110 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
19120 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
19130 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
19140 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28  _BKPT;..    for(
19150 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
19160 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
19170 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
19180 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
19190 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
191a0 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b  t, nFin, iFree);
191b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
191c0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
191d0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
191e0 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
191f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19200 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
19210 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
19220 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
19230 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
19240 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
19250 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
19260 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
19270 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
19280 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
19290 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
192a0 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
192b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
192c0 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
192d0 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20  pPager, nFin);. 
192e0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
192f0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
19300 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
19320 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
19330 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
19340 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
19350 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67  nRef==sqlite3Pag
19360 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
19370 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
19380 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
19390 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
193a0 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
193b0 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
193c0 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
193d0 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
193e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
193f0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
19400 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
19410 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
19420 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
19430 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
19440 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
19450 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
19460 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
19470 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
19480 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
19490 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
194a0 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
194b0 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
194c0 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
194d0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
194e0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
194f0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
19500 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
19510 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
19520 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
19530 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
19540 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
19550 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
19560 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
19570 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
19580 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
19590 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
195a0 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
195b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
195c0 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
195d0 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
195e0 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
195f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
19600 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
19610 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
19620 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
19630 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
19640 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
19650 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
19660 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
19670 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
19680 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
19690 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
196a0 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
196b0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
196c0 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
196d0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
196e0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
196f0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
19700 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
19710 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
19720 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
19730 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
19740 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
19750 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
19760 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
19770 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19780 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
19790 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
197a0 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
197b0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
197c0 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
197d0 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
197e0 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
197f0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
19800 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
19810 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
19820 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
19830 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
19840 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
19850 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
19860 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
19870 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
19880 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
19890 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
198a0 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
198b0 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
198c0 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
198d0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
198e0 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
198f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
19900 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
19910 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
19920 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
19930 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19940 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
19950 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
19960 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
19970 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19980 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
19990 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
199a0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
199b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
199c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
199d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
199e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
199f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
19a00 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
19a10 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
19a20 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
19a30 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
19a40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19a50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19a60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19a70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19a80 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
19a90 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
19aa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
19ab0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
19ac0 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
19ad0 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
19ae0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19af0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
19b00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19b10 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
19b20 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
19b30 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
19b40 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
19b50 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
19b60 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
19b70 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
19b80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
19b90 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
19ba0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
19bb0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19bc0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
19bd0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
19be0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20  sMutex(p) );..  
19bf0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
19c00 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28  tent(pBt);.  if(
19c10 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
19c20 53 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d  S_NONE && p->db-
19c30 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31  >activeVdbeCnt>1
19c40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
19c50 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
19c60 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
19c70 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
19c80 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
19c90 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
19ca0 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
19cb0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
19cc0 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
19cd0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
19ce0 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
19cf0 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
19d00 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
19d10 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
19d20 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
19d30 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
19d40 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
19d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19d60 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
19d70 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
19d80 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
19d90 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
19da0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
19db0 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
19dc0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
19dd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
19de0 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
19df0 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
19e00 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
19e10 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
19e20 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
19e30 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
19e40 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
19e50 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
19e60 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
19e70 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
19e80 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
19e90 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
19ea0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
19eb0 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
19ec0 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
19ed0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
19ee0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
19ef0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
19f00 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
19f10 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
19f20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
19f30 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
19f40 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
19f50 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
19f60 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
19f70 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
19f80 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
19f90 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
19fa0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
19fb0 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
19fc0 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
19fd0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
19fe0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
19ff0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1a000 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
1a010 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
1a020 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
1a030 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
1a040 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1a050 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
1a060 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
1a070 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
1a080 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
1a090 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1a0a0 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
1a0b0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
1a0c0 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
1a0d0 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
1a0e0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
1a0f0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
1a100 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
1a110 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
1a120 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
1a130 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
1a140 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
1a150 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
1a160 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
1a170 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
1a180 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
1a190 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
1a1a0 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
1a1b0 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
1a1c0 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
1a1d0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
1a1e0 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
1a1f0 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
1a200 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1a210 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
1a220 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a230 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
1a240 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
1a250 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
1a260 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1a270 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
1a280 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
1a290 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
1a2a0 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
1a2b0 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
1a2c0 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
1a2d0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
1a2e0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
1a2f0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
1a300 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
1a310 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
1a320 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1a330 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
1a340 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
1a350 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1a360 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
1a370 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
1a380 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
1a390 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
1a3a0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1a3b0 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
1a3c0 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
1a3d0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1a3e0 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
1a3f0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
1a400 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
1a410 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
1a420 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
1a430 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
1a440 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
1a450 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
1a460 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
1a470 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
1a480 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1a490 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
1a4a0 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
1a4b0 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
1a4c0 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
1a4d0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
1a4e0 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
1a4f0 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
1a500 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
1a510 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1a520 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1a530 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a540 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1a550 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1a560 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1a570 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1a580 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1a590 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a5a0 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
1a5b0 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
1a5c0 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
1a5d0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1a5e0 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
1a5f0 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
1a600 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a610 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1a620 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1a630 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
1a640 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
1a650 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
1a660 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
1a670 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1a680 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
1a690 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1a6a0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
1a6b0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1a6c0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1a6d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
1a6e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1a6f0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1a700 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1a710 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1a720 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
1a730 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1a740 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
1a750 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1a760 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
1a770 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1a780 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a790 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
1a7a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1a7b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a7c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a7d0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
1a7e0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1a7f0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
1a800 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1a810 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
1a820 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a830 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a840 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
1a850 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
1a860 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
1a870 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1a880 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
1a890 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1a8a0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a8b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1a8c0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1a8d0 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
1a8e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a8f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a900 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1a910 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  eTwo(p, 0);.  }.
1a920 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1a930 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1a940 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1a950 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
1a960 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1a970 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  f write-cursors 
1a980 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e  open on this han
1a990 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72  dle. This is for
1a9a0 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
1a9b0 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
1a9c0 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
1a9d0 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
1a9e0 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
1a9f0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ned..**.** For t
1aa00 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
1aa10 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77  his routine, a w
1aa20 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61  rite-cursor is a
1aa30 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
1aa40 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
1aa50 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
1aa60 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65  atabse.  That me
1aa70 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77  ans the cursor w
1aa80 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79  as.** originally
1aa90 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
1aaa0 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73  ing and the curs
1aab0 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69  or has not be di
1aac0 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76  sabled.** by hav
1aad0 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68  ing its state ch
1aae0 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f  anged to CURSOR_
1aaf0 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  FAULT..*/.static
1ab00 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43   int countWriteC
1ab10 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
1ab20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
1ab30 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
1ab40 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
1ab50 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
1ab60 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
1ab70 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1ab80 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
1ab90 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1aba0 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
1abb0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
1abc0 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
1abd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1abe0 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
1abf0 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
1ac00 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
1ac10 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
1ac20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
1ac30 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61   on BtShared tha
1ac40 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
1ac50 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76  rences..**.** Ev
1ac60 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72  ery cursor is tr
1ac70 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
1ac80 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65   cursors that be
1ac90 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72  long.** to other
1aca0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1acb0 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
1acc0 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a  n to be sharing.
1acd0 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ** the cache wit
1ace0 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
1acf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
1ad00 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
1ad10 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
1ad20 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
1ad30 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
1ad40 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69  ache must be tri
1ad50 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65  pped.** to preve
1ad60 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79  nt them from try
1ad70 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62  ing to use the b
1ad80 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  tree after.** th
1ad90 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  e rollback.  The
1ada0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
1adb0 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65  ve deleted table
1adc0 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f  s.** or moved ro
1add0 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20  ot pages, so it 
1ade0 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
1adf0 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65  t to.** save the
1ae00 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
1ae10 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f  rsor.  The curso
1ae20 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76  r must be.** inv
1ae30 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  alidated..*/.voi
1ae40 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d sqlite3BtreeTr
1ae50 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
1ae60 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
1ae70 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75  errCode){.  BtCu
1ae80 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70  rsor *p;.  if( p
1ae90 42 74 72 65 65 3d 3d 30 20 29 20 72 65 74 75 72  Btree==0 ) retur
1aea0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
1aeb0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1aec0 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
1aed0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1aee0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1aef0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c    int i;.    sql
1af00 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1af10 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e  rsor(p);.    p->
1af20 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1af30 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b  FAULT;.    p->sk
1af40 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
1af50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1af60 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
1af70 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1af80 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
1af90 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61  );.      p->apPa
1afa0 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
1afb0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1afc0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
1afd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1afe0 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
1aff0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
1b000 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
1b010 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
1b020 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
1b030 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
1b040 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
1b050 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
1b060 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
1b070 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
1b080 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
1b090 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
1b0a0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
1b0b0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1b0c0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1b0d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b0e0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1b0f0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1b100 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1b110 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1b120 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1b130 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
1b140 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72  Btree *p, int tr
1b150 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72  ipCode){.  int r
1b160 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1b170 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
1b180 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
1b190 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1b1a0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74  nter(p);.  if( t
1b1b0 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
1b1c0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74  OK ){.    rc = t
1b1d0 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c  ripCode = saveAl
1b1e0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1b1f0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
1b200 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1b210 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70  ;.  }.  if( trip
1b220 43 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Code ){.    sqli
1b230 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
1b240 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
1b250 64 65 29 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65  de);.  }.  btree
1b260 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1b270 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1b280 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1b290 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20      int rc2;..  
1b2a0 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
1b2b0 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
1b2c0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
1b2d0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
1b2e0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
1b2f0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1b300 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
1b310 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
1b320 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
1b330 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
1b340 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
1b350 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
1b360 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
1b370 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65     ** call btree
1b380 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67  GetPage() on pag
1b390 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b  e 1 again to mak
1b3a0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50  e.    ** sure pP
1b3b0 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73  age1->aData is s
1b3c0 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f  et correctly. */
1b3d0 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65  .    if( btreeGe
1b3e0 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
1b3f0 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54  Page1, 0)==SQLIT
1b400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
1b410 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  t nPage = get4by
1b420 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
1b430 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20  1->aData);.     
1b440 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65   testcase( nPage
1b450 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
1b460 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69   nPage==0 ) sqli
1b470 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1b480 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  t(pBt->pPager, &
1b490 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65  nPage);.      te
1b4a0 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61  stcase( pBt->nPa
1b4b0 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20  ge!=nPage );.   
1b4c0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1b4d0 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c  nPage;.      rel
1b4e0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
1b4f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1b500 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
1b510 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
1b520 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
1b530 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1b540 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  READ;.  }..  btr
1b550 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1b560 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
1b570 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1b580 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b590 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65  ** Start a state
1b5a0 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
1b5b0 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
1b5c0 73 61 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20  saction can can 
1b5d0 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
1b5e0 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
1b5f0 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
1b600 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
1b610 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
1b620 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
1b630 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
1b640 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1b650 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
1b660 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
1b670 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
1b680 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
1b690 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
1b6a0 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
1b6b0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
1b6c0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
1b6d0 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
1b6e0 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
1b6f0 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
1b700 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
1b710 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
1b720 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
1b730 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
1b740 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
1b750 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
1b760 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
1b770 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
1b780 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
1b790 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
1b7a0 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
1b7b0 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
1b7c0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1b7d0 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
1b7e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
1b7f0 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
1b800 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1b810 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
1b820 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
1b830 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
1b840 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
1b850 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
1b860 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
1b870 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
1b880 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
1b890 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
1b8a0 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
1b8b0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1b8c0 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
1b8d0 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
1b8e0 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
1b8f0 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
1b900 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
1b910 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1b920 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
1b930 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
1b940 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
1b950 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1b960 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
1b970 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b980 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
1b990 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
1b9a0 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
1b9b0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
1b9c0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
1b9d0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b9e0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1b9f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1ba00 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
1ba10 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
1ba20 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1ba30 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LY)==0 );.  asse
1ba40 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
1ba50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1ba60 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
1ba70 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
1ba80 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1ba90 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1baa0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
1bab0 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
1bac0 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
1bad0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1bae0 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
1baf0 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
1bb00 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
1bb10 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
1bb20 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
1bb30 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
1bb40 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
1bb50 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
1bb60 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1bb70 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
1bb80 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
1bb90 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1bba0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
1bbb0 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
1bbc0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1bbd0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
1bbe0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
1bbf0 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
1bc00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1bc10 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1bc20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1bc30 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1bc40 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1bc50 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
1bc60 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
1bc70 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
1bc80 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
1bc90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
1bca0 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
1bcb0 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
1bcc0 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
1bcd0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
1bce0 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
1bcf0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
1bd00 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
1bd10 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1bd20 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
1bd30 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1bd40 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
1bd50 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
1bd60 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
1bd70 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
1bd80 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
1bd90 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
1bda0 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
1bdb0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
1bdc0 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
1bdd0 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
1bde0 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
1bdf0 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
1be00 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
1be10 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
1be20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
1be30 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
1be40 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
1be50 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
1be60 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
1be70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
1be80 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
1be90 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
1bea0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1beb0 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
1bec0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1bed0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1bee0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1bef0 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
1bf00 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1bf10 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
1bf20 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
1bf30 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
1bf40 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
1bf50 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
1bf60 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
1bf70 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
1bf80 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1bf90 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
1bfa0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
1bfb0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1bfc0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
1bfd0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bfe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bff0 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
1c000 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
1c010 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
1c020 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
1c030 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
1c040 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
1c050 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1c060 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1c070 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1c080 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
1c090 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1c0a0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
1c0b0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
1c0c0 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
1c0d0 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
1c0e0 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
1c0f0 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
1c100 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
1c110 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
1c120 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
1c130 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
1c140 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
1c150 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1c160 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
1c170 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1c180 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1c190 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c1a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1c1b0 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
1c1c0 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
1c1d0 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
1c1e0 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
1c1f0 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
1c200 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
1c210 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
1c220 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
1c230 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
1c240 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
1c250 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
1c260 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
1c270 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
1c280 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
1c290 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1c2a0 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
1c2b0 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
1c2c0 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
1c2d0 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
1c2e0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
1c2f0 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
1c300 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
1c310 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
1c320 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
1c330 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
1c340 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
1c350 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
1c360 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
1c370 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
1c380 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
1c390 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
1c3a0 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
1c3b0 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
1c3c0 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
1c3d0 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
1c3e0 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
1c3f0 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
1c400 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
1c410 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
1c420 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
1c430 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
1c440 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c450 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
1c460 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
1c470 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
1c480 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
1c490 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
1c4a0 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
1c4b0 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
1c4c0 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
1c4d0 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
1c4e0 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
1c4f0 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
1c500 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
1c510 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
1c520 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
1c530 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
1c540 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
1c550 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
1c560 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c570 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
1c580 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
1c590 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
1c5a0 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
1c5b0 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
1c5c0 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
1c5d0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
1c5e0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
1c5f0 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
1c600 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1c610 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
1c620 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
1c630 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
1c640 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
1c650 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
1c660 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
1c670 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
1c680 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
1c690 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1c6a0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
1c6b0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
1c6c0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
1c6d0 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
1c6e0 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
1c6f0 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
1c700 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
1c710 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
1c720 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
1c730 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c760 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1c770 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c790 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1c7a0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1c7b0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1c7c0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c7e0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
1c7f0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
1c800 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
1c810 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
1c820 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
1c830 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
1c840 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
1c850 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
1c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c870 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
1c880 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
1c890 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
1c8a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
1c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c8c0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
1c8d0 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ndle */..  asser
1c8e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
1c8f0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
1c900 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1c910 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31  ==0 || wrFlag==1
1c920 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   );..  /* The fo
1c930 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73  llowing assert s
1c940 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79  tatements verify
1c950 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73   that if this is
1c960 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a   a sharable .  *
1c970 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73  * b-tree databas
1c980 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  e, the connectio
1c990 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  n is holding the
1c9a0 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20   required table 
1c9b0 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64  locks, .  ** and
1c9c0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63   that no other c
1c9d0 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e  onnection has an
1c9e0 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68  y open cursor th
1c9f0 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74  at conflicts wit
1ca00 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63  h .  ** this loc
1ca10 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  k.  */.  assert(
1ca20 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1ca30 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
1ca40 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c  le, pKeyInfo!=0,
1ca50 20 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20   wrFlag+1) );.  
1ca60 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
1ca70 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e  0 || !hasReadCon
1ca80 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65  flicts(p, iTable
1ca90 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  ) );..  /* Asser
1caa0 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  t that the calle
1cab0 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65  r has opened the
1cac0 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61   required transa
1cad0 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  ction. */.  asse
1cae0 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54  rt( p->inTrans>T
1caf0 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  RANS_NONE );.  a
1cb00 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1cb10 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   || p->inTrans==
1cb20 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1cb30 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
1cb40 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61  age1 && pBt->pPa
1cb50 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20  ge1->aData );.. 
1cb60 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
1cb70 67 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  g && (pBt->btsFl
1cb80 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1cb90 4e 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  NLY)!=0) ){.    
1cba0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
1cbb0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
1cbc0 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
1cbd0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1cbe0 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
1cbf0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
1cc00 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
1cc10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
1cc20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
1cc30 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
1cc40 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
1cc50 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
1cc60 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
1cc70 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
1cc80 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
1cc90 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
1cca0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
1ccb0 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
1ccc0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
1ccd0 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
1cce0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
1ccf0 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
1cd00 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
1cd10 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77  = pBt;.  pCur->w
1cd20 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c  rFlag = (u8)wrFl
1cd30 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78  ag;.  pCur->pNex
1cd40 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  t = pBt->pCursor
1cd50 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e  ;.  if( pCur->pN
1cd60 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ext ){.    pCur-
1cd70 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
1cd80 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  pCur;.  }.  pBt-
1cd90 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
1cda0 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
1cdb0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1cdc0 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64  ;.  pCur->cached
1cdd0 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74  Rowid = 0;.  ret
1cde0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1cdf0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1ce00 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1ce10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
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 2f 2a 20 54 68 65 20 62 74         /* The bt
1ce40 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
1ce50 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1ce80 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
1ce90 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
1cea0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cec0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
1ced0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
1cee0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
1cef0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf10 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1cf20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
1cf30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1cf60 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
1cf70 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
1cf80 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
1cf90 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
1cfa0 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
1cfb0 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
1cfc0 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
1cfd0 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
1cfe0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1cff0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d000 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1d010 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20  e of a BtCursor 
1d020 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e  object in bytes.
1d030 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65  .**.** This inte
1d040 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65 64  rfaces is needed
1d050 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f   so that users o
1d060 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72  f cursors can pr
1d070 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66  eallocate.** suf
1d080 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20  ficient storage 
1d090 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72  to hold a cursor
1d0a0 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72 20  .  The BtCursor 
1d0b0 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65  object is opaque
1d0c0 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20  .** to users so 
1d0d0 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74  they cannot do t
1d0e0 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d  he sizeof() them
1d0f0 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75  selves - they mu
1d100 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  st call.** this 
1d110 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
1d120 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d130 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20  orSize(void){.  
1d140 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69  return ROUND8(si
1d150 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b  zeof(BtCursor));
1d160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
1d170 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74  lize memory that
1d180 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74   will be convert
1d190 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73  ed into a BtCurs
1d1a0 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  or object..**.**
1d1b0 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72   The simple appr
1d1c0 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20  oach here would 
1d1d0 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74  be to memset() t
1d1e0 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74  he entire object
1d1f0 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75  .** to zero.  Bu
1d200 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74  t it turns out t
1d210 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d  hat the apPage[]
1d220 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72   and aiIdx[] arr
1d230 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65  ays.** do not ne
1d240 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20  ed to be zeroed 
1d250 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61 72  and they are lar
1d260 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61  ge, so we can sa
1d270 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72  ve a lot.** of r
1d280 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70  un-time by skipp
1d290 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
1d2a0 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20  zation of those 
1d2b0 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69  elements..*/.voi
1d2c0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
1d2d0 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f  rsorZero(BtCurso
1d2e0 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  r *p){.  memset(
1d2f0 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42  p, 0, offsetof(B
1d300 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29  tCursor, iPage))
1d310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1d320 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20  he cached rowid 
1d330 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63  value of every c
1d340 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d  ursor in the sam
1d350 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1d360 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68  ** as pCur and h
1d370 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72  aving the same r
1d380 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
1d390 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61  as pCur.  The va
1d3a0 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
1d3b0 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f   iRowid..**.** O
1d3c0 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77  nly positive row
1d3d0 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f  id values are co
1d3e0 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66  nsidered valid f
1d3f0 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a  or this cache..*
1d400 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69  * The cache is i
1d410 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
1d420 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  ro, indicating a
1d430 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e  n invalid cache.
1d440 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c  .** A btree will
1d450 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20   work fine with 
1d460 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1d470 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73   rowids.  We jus
1d480 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68  t cannot.** cach
1d490 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69  e zero or negati
1d4a0 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68  ve rowids, which
1d4b0 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68   means tables th
1d4c0 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a  at use zero or.*
1d4d0 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  * negative rowid
1d4e0 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
1d4f0 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75  ttle slower.  Bu
1d500 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a  t in practice, z
1d510 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69  ero.** or negati
1d520 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65  ve rowids are ve
1d530 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74  ry uncommon so t
1d540 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  his should not b
1d550 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
1d560 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
1d570 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eSetCachedRowid(
1d580 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1d590 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52  sqlite3_int64 iR
1d5a0 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f  owid){.  BtCurso
1d5b0 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43  r *p;.  for(p=pC
1d5c0 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ur->pBt->pCursor
1d5d0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
1d5e0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e  {.    if( p->pgn
1d5f0 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e  oRoot==pCur->pgn
1d600 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65  oRoot ) p->cache
1d610 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  dRowid = iRowid;
1d620 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1d630 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  Cur->cachedRowid
1d640 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f  ==iRowid );.}../
1d650 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1d660 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72  cached rowid for
1d670 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
1d680 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f  r.  A negative o
1d690 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e  r zero.** return
1d6a0 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
1d6b0 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
1d6c0 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64  cache is invalid
1d6d0 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a   and should be.*
1d6e0 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74  * ignored.  If t
1d6f0 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68  he rowid cache h
1d700 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20  as never before 
1d710 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61  been set, then a
1d720 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75  .** zero is retu
1d730 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rned..*/.sqlite3
1d740 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
1d750 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69  reeGetCachedRowi
1d760 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1d770 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
1d780 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d  ->cachedRowid;.}
1d790 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1d7a0 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
1d7b0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
1d7c0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
1d7d0 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
1d7e0 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
1d7f0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
1d800 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
1d810 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
1d820 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
1d830 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
1d840 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
1d850 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
1d860 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
1d870 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1d880 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
1d890 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1d8a0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
1d8b0 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
1d8c0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
1d8d0 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
1d8e0 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
1d8f0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
1d900 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
1d910 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
1d920 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
1d930 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
1d940 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
1d950 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
1d960 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
1d970 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
1d980 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
1d990 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
1d9a0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1d9b0 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
1d9c0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
1d9d0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1d9e0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
1d9f0 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
1da00 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
1da10 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
1da20 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
1da30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1da40 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
1da50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1da60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1da70 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
1da80 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
1da90 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
1daa0 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
1dab0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
1dac0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
1dad0 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
1dae0 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
1daf0 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
1db00 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
1db10 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
1db20 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
1db30 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
1db40 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
1db50 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
1db60 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
1db70 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
1db80 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
1db90 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
1dba0 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
1dbb0 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
1dbc0 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
1dbd0 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
1dbe0 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
1dbf0 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
1dc00 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
1dc10 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
1dc20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1dc30 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
1dc40 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
1dc50 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
1dc60 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
1dc70 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
1dc80 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
1dc90 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
1dca0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
1dcb0 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
1dcc0 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
1dcd0 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
1dce0 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
1dcf0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
1dd00 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
1dd10 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
1dd20 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
1dd30 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
1dd40 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
1dd50 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1dd60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1dd70 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
1dd80 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
1dd90 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1dda0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
1ddb0 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
1ddc0 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61  o));.    btreePa
1ddd0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1dde0 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75  Page[iPage], pCu
1ddf0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1de00 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
1de10 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66  ert( memcmp(&inf
1de20 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
1de30 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
1de40 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
1de50 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
1de60 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
1de70 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
1de80 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
1de90 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
1dea0 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
1deb0 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
1dec0 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
1ded0 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
1dee0 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
1def0 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
1df00 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
1df10 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1df20 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
1df30 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
1df40 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1df50 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1df60 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1df70 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1df80 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1df90 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
1dfa0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1dfb0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1dfc0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
1dfd0 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
1dfe0 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
1dff0 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
1e000 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
1e010 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
1e020 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
1e030 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
1e040 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
1e050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
1e090 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
1e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
1e0e0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72    \.    btreePar
1e130 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1e140 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1e150 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1e160 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20  Cur->info); \.  
1e170 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1e180 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  y = 1;          
1e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e1c0 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1e210 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1e220 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20 20  fo(pCur);       
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1e260 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f  .  }.#endif /* _
1e270 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e  MSC_VER */..#ifn
1e280 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
1e290 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
1e2a0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
1e2b0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1e2c0 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
1e2d0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1e2e0 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
1e2f0 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
1e300 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
1e310 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
1e320 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
1e330 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
1e340 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
1e350 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
1e360 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
1e370 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
1e380 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
1e390 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
1e3a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
1e3b0 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
1e3c0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1e3d0 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
1e3e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e3f0 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
1e400 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
1e410 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1e420 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
1e430 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
1e440 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
1e450 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
1e460 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
1e470 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
1e480 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
1e490 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
1e4a0 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
1e4b0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
1e4c0 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
1e4d0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
1e4e0 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
1e4f0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1e500 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
1e510 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
1e520 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1e530 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  n the key..**.**
1e540 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
1e550 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   position the cu
1e560 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e  rsor prior to in
1e570 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
1e580 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ine..** .** This
1e590 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
1e5a0 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73  fail.  It always
1e5b0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1e5c0 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OK.  .*/.int sql
1e5d0 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
1e5e0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1e5f0 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
1e600 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1e610 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1e620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1e630 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1e640 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  _INVALID || pCur
1e650 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1e660 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20  _VALID );.  if( 
1e670 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1e680 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
1e690 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
1e6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65  }else{.    getCe
1e6b0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1e6c0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1e6d0 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a  >info.nKey;.  }.
1e6e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e6f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
1e700 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e   *pSize to the n
1e710 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1e720 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e  f data in the en
1e730 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  try the.** curso
1e740 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  r currently poin
1e750 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ts to..**.** The
1e760 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
1e770 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
1e780 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1e790 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
1e7a0 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
1e7b0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1e7c0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
1e7d0 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
1e7e0 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
1e7f0 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
1e800 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
1e810 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
1e820 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20   Failure is not 
1e830 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20  possible.  This 
1e840 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
1e850 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1e860 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a  K..** It might j
1e870 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61  ust as well be a
1e880 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75   procedure (retu
1e890 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20  rning void) but 
1e8a0 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74  we continue.** t
1e8b0 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  o return an inte
1e8c0 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20  ger result code 
1e8d0 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72  for historical r
1e8e0 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73  easons..*/.int s
1e8f0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53  qlite3BtreeDataS
1e900 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
1e910 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b  ur, u32 *pSize){
1e920 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1e930 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1e940 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e950 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e960 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
1e970 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1e980 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
1e990 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
1e9a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e9b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  K;.}../*.** Give
1e9c0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1e9d0 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
1e9e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
1e9f0 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
1ea00 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
1ea10 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
1ea20 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1ea30 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
1ea40 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
1ea50 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
1ea60 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
1ea70 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
1ea80 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
1ea90 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
1eaa0 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
1eab0 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
1eac0 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
1ead0 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
1eae0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1eaf0 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
1eb00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
1eb10 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
1eb20 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
1eb30 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
1eb40 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1eb50 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
1eb60 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
1eb70 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
1eb80 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
1eb90 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1eba0 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
1ebb0 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
1ebc0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
1ebd0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
1ebe0 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
1ebf0 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
1ec00 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
1ec10 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
1ec20 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
1ec30 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
1ec40 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
1ec50 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1ec60 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
1ec70 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
1ec80 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
1ec90 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
1eca0 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
1ecb0 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
1ecc0 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
1ecd0 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
1ece0 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
1ecf0 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
1ed00 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
1ed10 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
1ed20 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
1ed30 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
1ed40 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
1ed50 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1ed60 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
1ed70 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
1ed80 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
1ed90 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
1eda0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1edb0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
1edc0 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
1edd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1ede0 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
1edf0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
1ee00 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
1ee10 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1ee20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
1ee30 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
1ee40 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
1ee50 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
1ee60 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
1ee70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
1ee80 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
1ee90 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
1eea0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1eeb0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
1eec0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
1eed0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1eee0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1eef0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
1ef00 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
1ef10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ef20 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
1ef30 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
1ef40 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1ef50 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
1ef60 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
1ef70 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
1ef80 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
1ef90 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
1efa0 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
1efb0 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
1efc0 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
1efd0 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
1efe0 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
1eff0 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
1f000 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
1f010 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
1f020 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
1f030 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
1f040 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
1f050 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
1f060 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
1f070 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
1f080 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
1f090 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
1f0a0 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
1f0b0 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
1f0c0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1f0d0 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
1f0e0 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
1f0f0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1f100 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
1f110 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
1f120 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65  Guess<=btreePage
1f130 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
1f140 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1f150 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
1f160 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
1f170 20 20 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 26 26 20 65 54 79 70 65  LITE_OK && eType
1f190 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1f1a0 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
1f1b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
1f1c0 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
1f1d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1f1e0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
1f1f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1f200 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
1f210 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
1f220 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
1f230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f240 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1f250 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
1f260 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61  pPage, 0);.    a
1f270 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1f280 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30  E_OK || pPage==0
1f290 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
1f2a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f2b0 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
1f2c0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
1f2d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
1f2e0 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
1f2f0 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29  ;.  if( ppPage )
1f300 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
1f310 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pPage;.  }else{.
1f320 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f330 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
1f340 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
1f350 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f  _DONE ? SQLITE_O
1f360 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  K : rc);.}../*.*
1f370 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1f380 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70   a buffer to a p
1f390 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70  age, or from a p
1f3a0 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e  age to a buffer.
1f3b0 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20  .**.** pPayload 
1f3c0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1f3d0 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64  data stored on d
1f3e0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1f3f0 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75  Page..** If argu
1f400 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73  ment eOp is fals
1f410 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79  e, then nByte by
1f420 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20  tes of data are 
1f430 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70  copied.** from p
1f440 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62  Payload to the b
1f450 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74  uffer pointed at
1f460 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70   by pBuf. If eOp
1f470 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65   is true,.** the
1f480 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1f490 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1f4a0 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e  on pDbPage and n
1f4b0 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66  Byte bytes.** of
1f4c0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1f4d0 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1f4e0 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61   pBuf to pPayloa
1f4f0 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
1f500 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
1f510 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72  n success, other
1f520 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  wise an error co
1f530 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
1f540 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20  t copyPayload(. 
1f550 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c   void *pPayload,
1f560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1f570 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61  inter to page da
1f580 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  ta */.  void *pB
1f590 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1f5a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1f5b0 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
1f5c0 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
1f5d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1f5e0 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79  of bytes to copy
1f5f0 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20   */.  int eOp,  
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f  /* 0 -> copy fro
1f620 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70  m page, 1 -> cop
1f630 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44  y to page */.  D
1f640 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20  bPage *pDbPage  
1f650 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
1f660 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79   containing pPay
1f670 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  load */.){.  if(
1f680 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43   eOp ){.    /* C
1f690 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75  opy data from bu
1f6a0 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20  ffer to page (a 
1f6b0 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29  write operation)
1f6c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d   */.    int rc =
1f6d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1f6e0 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
1f6f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f700 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1f710 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1f720 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
1f730 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a  , pBuf, nByte);.
1f740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1f750 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70  Copy data from p
1f760 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61  age to buffer (a
1f770 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29   read operation)
1f780 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   */.    memcpy(p
1f790 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e  Buf, pPayload, n
1f7a0 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Byte);.  }.  ret
1f7b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f7c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1f7d0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
1f7e0 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69   read or overwri
1f7f0 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  te payload infor
1f800 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68  mation.** for th
1f810 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
1f820 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
1f830 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20  pointing to. If 
1f840 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d  the eOp.** param
1f850 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20  eter is 0, this 
1f860 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74  is a read operat
1f870 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64  ion (data copied
1f880 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20   into.** buffer 
1f890 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20  pBuf). If it is 
1f8a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74  non-zero, a writ
1f8b0 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66  e (data copied f
1f8c0 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  rom.** buffer pB
1f8d0 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  uf)..**.** A tot
1f8e0 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
1f8f0 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
1f900 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
1f910 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
1f920 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
1f930 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
1f940 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
1f950 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
1f960 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1f970 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
1f980 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
1f990 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
1f9a0 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
1f9b0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
1f9c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42  ..**.** If the B
1f9d0 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c  tCursor.isIncrbl
1f9e0 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73  obHandle flag is
1f9f0 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75   set, and the cu
1fa00 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20  rrent.** cursor 
1fa10 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
1fa20 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
1fa30 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63  pages, this func
1fa40 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  tion.** allocate
1fa50 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20  s space for and 
1fa60 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73  lazily popluates
1fa70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
1fa80 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68  ge-list .** cach
1fa90 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f  e array (BtCurso
1faa0 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75  r.aOverflow). Su
1fab0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
1fac0 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65  se this.** cache
1fad0 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
1fae0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
1faf0 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66   offset more eff
1fb00 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
1fb10 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
1fb20 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
1fb30 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
1fb40 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20  d, it may be.** 
1fb50 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
1fb60 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
1fb70 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
1fb80 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
1fb90 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
1fba0 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
1fbb0 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
1fbc0 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
1fbd0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
1fbe0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
1fbf0 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
1fc00 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
1fc10 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1fc20 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
1fc30 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1fc40 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
1fc50 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
1fc60 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
1fc70 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
1fc80 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
1fc90 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
1fca0 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
1fcb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
1fcc0 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
1fcd0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1fce0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
1fcf0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
1fd00 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
1fd10 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
1fd20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
1fd30 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
1fd40 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
1fd50 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
1fd60 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
1fd70 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
1fd80 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1fd90 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
1fda0 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
1fdb0 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
1fdc0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
1fdd0 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
1fde0 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
1fdf0 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
1fe00 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1fe10 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
1fe20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1fe30 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  K;.  u32 nKey;. 
1fe40 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20   int iIdx = 0;. 
1fe50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
1fe60 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1fe70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
1fe80 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
1fe90 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20  rrent entry */. 
1fea0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1feb0 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20   pCur->pBt;     
1fec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fed0 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
1fee0 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
1fef0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ff00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ff10 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ff20 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
1ff30 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1ff40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1ff50 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1ff60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1ff70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1ff80 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
1ff90 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
1ffa0 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1ffb0 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
1ffc0 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
1ffd0 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
1ffe0 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29  tKey ? 0 : (int)
1fff0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29  pCur->info.nKey)
20000 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f  ;..  if( NEVER(o
20010 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79  ffset+amt > nKey
20020 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74  +pCur->info.nDat
20030 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c  a) .   || &aPayl
20040 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
20050 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
20060 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
20070 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20  leSize].  ){.   
20080 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
20090 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
200a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
200b0 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
200c0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
200d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
200e0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
200f0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
20100 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
20110 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
20120 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
20130 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
20140 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
20150 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
20160 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
20170 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
20180 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
20190 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
201a0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
201b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
201c0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
201d0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
201e0 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50  pBuf, a, eOp, pP
201f0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
20200 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
20210 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
20220 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
20230 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
20240 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
20250 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ocal;.  }..  if(
20260 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20270 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
20280 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
20290 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
202a0 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
202b0 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
202c0 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
202d0 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
202e0 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
202f0 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
20300 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
20310 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20  cal]);..#ifndef 
20320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
20330 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  BLOB.    /* If t
20340 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  he isIncrblobHan
20350 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20  dle flag is set 
20360 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72  and the BtCursor
20370 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20  .aOverflow[].   
20380 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e   ** has not been
20390 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f   allocated, allo
203a0 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65  cate it now. The
203b0 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
203c0 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e  at.    ** one en
203d0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
203e0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
203f0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
20400 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67  . The.    ** pag
20410 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
20420 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
20430 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
20440 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20   aOverflow[0],. 
20450 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c     ** etc. A val
20460 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
20470 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
20480 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
20490 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74  known".    ** (t
204a0 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
204b0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
204c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
204d0 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61  ur->isIncrblobHa
204e0 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61  ndle && !pCur->a
204f0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
20500 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
20510 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
20520 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
20530 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
20540 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
20550 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
20560 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74   = (Pgno *)sqlit
20570 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
20580 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29  eof(Pgno)*nOvfl)
20590 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c  ;.      /* nOvfl
205a0 20 69 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74   is always posit
205b0 69 76 65 2e 20 20 49 66 20 69 74 20 77 65 72 65  ive.  If it were
205c0 20 7a 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c   zero, fetchPayl
205d0 6f 61 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20  oad would have. 
205e0 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65       ** been use
205f0 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69  d instead of thi
20600 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20  s routine. */.  
20610 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e      if( ALWAYS(n
20620 4f 76 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e  Ovfl) && !pCur->
20630 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
20640 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20650 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
20660 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
20670 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
20680 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
20690 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
206a0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
206b0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
206c0 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
206d0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
206e0 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
206f0 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
20700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20710 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
20720 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
20730 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  ow[offset/ovflSi
20740 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64  ze] ){.      iId
20750 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
20760 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
20770 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
20780 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
20790 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
207a0 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
207b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
207c0 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51     for( ; rc==SQ
207d0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
207e0 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49   && nextPage; iI
207f0 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20  dx++){..#ifndef 
20800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
20810 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66  BLOB.      /* If
20820 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
20830 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
20840 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
20850 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
20860 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
20870 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
20880 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  (!pCur->aOverflo
20890 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d  w[iIdx] || pCur-
208a0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
208b0 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20  ==nextPage);.   
208c0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
208d0 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
208e0 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23  tPage;.      }.#
208f0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28  endif..      if(
20900 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a   offset>=ovflSiz
20910 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
20920 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20  The only reason 
20930 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
20940 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74  e is to obtain t
20950 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
20960 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
20970 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
20980 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
20990 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20  n. The page.    
209a0 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e      ** data is n
209b0 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20  ot required. So 
209c0 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f  first try to loo
209d0 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  kup the overflow
209e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
209f0 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20  -list cache, if 
20a00 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62  any, then fall b
20a10 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76  ack to the getOv
20a20 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20  erflowPage().   
20a30 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
20a40 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
20a50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20a60 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20  _INCRBLOB.      
20a70 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
20a80 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
20a90 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
20aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65   ){.          ne
20ab0 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
20ac0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d  Overflow[iIdx+1]
20ad0 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
20ae0 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
20af0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
20b00 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
20b10 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
20b20 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  age);.        of
20b30 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
20b40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20b50 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
20b60 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
20b70 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
20b80 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
20b90 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
20ba0 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
20bb0 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
20bc0 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
20bd0 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
20be0 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
20bf0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
20c00 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
20c10 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
20c20 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *fd;.#endif.    
20c30 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
20c40 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
20c50 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
20c60 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
20c70 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
20c80 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
20c90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
20ca0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
20cb0 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
20cc0 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
20cd0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
20ce0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20cf0 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
20d00 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
20d10 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
20d20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
20d30 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
20d40 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
20d50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
20d60 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
20d70 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65   3) the database
20d80 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
20d90 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
20da0 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f    4) there is no
20db0 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
20dc0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
20dd0 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
20de0 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
20df0 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
20e00 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
20e10 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
20e20 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
20e30 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
20e40 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
20e50 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
20e60 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
20e70 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
20e80 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
20e90 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
20ea0 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
20eb0 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
20ec0 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
20ed0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
20ee0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
20ef0 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d         if( eOp==
20f00 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20f30 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
20f40 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f70 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
20f80 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
20f90 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
20fa0 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20  =TRANS_READ     
20fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fc0 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20  /* (4) */.      
20fd0 20 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69     && (fd = sqli
20fe0 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
20ff0 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74  ->pPager))->pMet
21000 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20  hods     /* (3) 
21010 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
21020 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
21030 61 5b 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20  a[19]==0x01     
21040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21050 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20    /* (5) */.    
21060 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21070 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20   u8 aSave[4];.  
21080 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69          u8 *aWri
21090 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a  te = &pBuf[-4];.
210a0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
210b0 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
210c0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
210d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
210e0 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
210f0 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65  , (i64)pBt->page
21100 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31  Size*(nextPage-1
21110 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
21120 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
21130 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
21140 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
21150 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
21160 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
21170 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
21180 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
21190 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
211a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
211b0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
211c0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
211d0 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
211e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
211f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21200 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
21210 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
21220 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
21230 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
21240 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
21250 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
21260 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
21270 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
21280 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
21290 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
212a0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
212b0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
212c0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
212d0 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d          offset =
212e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   0;.          }.
212f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21300 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20    amt -= a;.    
21310 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
21320 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21330 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
21340 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
21350 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
21360 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
21370 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21380 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
21390 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
213a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
213b0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
213c0 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
213d0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
213e0 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
213f0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
21400 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
21410 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
21420 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
21430 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
21440 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
21450 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20   a valid row.** 
21460 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
21470 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
21480 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
21490 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
214a0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
214b0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
214c0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
214d0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
214e0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
214f0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
21500 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
21510 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
21520 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
21530 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
21540 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
21550 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
21560 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
21570 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
21580 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21590 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
215a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
215b0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
215c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
215d0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
215e0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
215f0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
21600 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21610 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
21620 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
21630 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
21640 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
21650 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
21660 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
21670 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
21680 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
21690 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
216a0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
216b0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
216c0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
216d0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
216e0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
216f0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
21700 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
21710 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
21720 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
21730 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
21740 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
21750 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
21760 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
21770 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
21780 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
21790 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
217a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
217b0 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
217c0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
217d0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
217e0 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
217f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21800 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
21810 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
21820 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
21830 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
21840 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
21850 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
21860 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21870 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
21880 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
21890 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
218a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
218b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
218c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
218d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
218e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
218f0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
21900 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21910 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
21920 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
21930 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21940 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
21950 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
21960 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
21970 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
21980 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
21990 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
219a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
219b0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
219c0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
219d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
219e0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
219f0 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
21a00 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
21a10 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
21a20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
21a30 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
21a40 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20  y if skipKey==0 
21a50 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  and it points to
21a60 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
21a70 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69  f data if.** ski
21a80 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75  pKey==1.  The nu
21a90 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
21aa0 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64   available key/d
21ab0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ata is written.*
21ac0 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  * into *pAmt.  I
21ad0 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
21ae0 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
21af0 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a  ned will not be.
21b00 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ** a valid point
21b10 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
21b20 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
21b30 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
21b40 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
21b50 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
21b60 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
21b70 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
21b80 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
21b90 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
21ba0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
21bb0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
21bc0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
21bd0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
21be0 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
21bf0 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
21c00 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
21c10 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
21c20 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
21c30 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
21c40 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
21c50 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
21c60 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
21c70 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
21c80 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
21c90 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
21ca0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
21cb0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
21cc0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
21cd0 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
21ce0 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
21cf0 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
21d00 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
21d10 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
21d20 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
21d30 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
21d40 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
21d50 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
21d60 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
21d70 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61  ed char *fetchPa
21d80 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
21d90 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
21da0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
21db0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
21dc0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
21dd0 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20  *pAmt,          
21de0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
21df0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
21e00 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
21e10 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
21e20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62         /* read b
21e30 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61  eginning at data
21e40 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
21e50 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
21e60 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
21e70 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
21e80 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  ge;.  u32 nKey;.
21e90 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20    u32 nLocal;.. 
21ea0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
21eb0 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
21ec0 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
21ed0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
21ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
21ef0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21f00 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
21f10 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21f20 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21f30 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
21f40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21f50 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
21f60 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
21f70 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
21f80 6c 6c 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  ll );.  if( NEVE
21f90 52 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  R(pCur->info.nSi
21fa0 7a 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 62 74  ze==0) ){.    bt
21fb0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
21fc0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21fd0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
21fe0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21ff0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22000 20 20 20 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f       &pCur->info
22010 29 3b 0a 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61  );.  }.  aPayloa
22020 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
22030 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
22040 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
22050 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
22060 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
22070 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
22080 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
22090 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
220a0 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28  .nKey;.  }.  if(
220b0 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20   skipKey ){.    
220c0 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79  aPayload += nKey
220d0 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  ;.    nLocal = p
220e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
220f0 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65   - nKey;.  }else
22100 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70  {.    nLocal = p
22110 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
22120 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4c  ;.    assert( nL
22130 6f 63 61 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20  ocal<=nKey );.  
22140 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63  }.  *pAmt = nLoc
22150 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50 61  al;.  return aPa
22160 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
22170 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
22180 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
22190 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
221a0 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
221b0 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
221c0 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
221d0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
221e0 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
221f0 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
22200 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
22210 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
22220 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
22230 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
22240 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
22250 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
22260 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
22270 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
22280 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
22290 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
222a0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
222b0 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
222c0 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
222d0 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
222e0 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
222f0 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
22300 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
22310 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
22320 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
22330 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
22340 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
22350 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
22360 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
22370 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
22380 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
22390 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
223a0 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
223b0 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
223c0 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28 42  3BtreeKeyFetch(B
223d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
223e0 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  nt *pAmt){.  con
223f0 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
22400 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22410 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
22420 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
22430 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
22440 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22450 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
22460 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
22470 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
22480 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
22490 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
224a0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
224b0 20 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20   pAmt, 0);.  }. 
224c0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e   return p;.}.con
224d0 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
224e0 42 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42  BtreeDataFetch(B
224f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
22500 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e  nt *pAmt){.  con
22510 73 74 20 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a  st void *p = 0;.
22520 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22530 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
22540 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
22550 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
22560 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22570 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
22580 66 28 20 41 4c 57 41 59 53 28 70 43 75 72 2d 3e  f( ALWAYS(pCur->
22590 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
225a0 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70 20 3d  ALID) ){.    p =
225b0 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65   (const void*)fe
225c0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
225d0 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20   pAmt, 1);.  }. 
225e0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
225f0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
22600 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
22610 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
22620 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
22630 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
22640 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
22650 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
22660 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
22670 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
22680 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
22690 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
226a0 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
226b0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
226c0 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
226d0 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
226e0 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
226f0 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
22700 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
22710 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
22720 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
22730 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
22740 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
22750 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
22760 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
22770 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
22780 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
22790 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 20  int rc;.  int i 
227a0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
227b0 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61   MemPage *pNewPa
227c0 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge;.  BtShared *
227d0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
227e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
227f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
22800 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
22810 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
22820 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
22830 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
22840 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
22850 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66 28 20  _DEPTH );.  if( 
22860 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54  pCur->iPage>=(BT
22870 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
22880 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
22890 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
228a0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20  _BKPT;.  }.  rc 
228b0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
228c0 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
228d0 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69 66 28  pNewPage);.  if(
228e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
228f0 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  .  pCur->apPage[
22900 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b  i+1] = pNewPage;
22910 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  .  pCur->aiIdx[i
22920 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  +1] = 0;.  pCur-
22930 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75  >iPage++;..  pCu
22940 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
22950 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
22960 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
22970 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  pNewPage->nCell<
22980 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69  1 || pNewPage->i
22990 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61 70 50  ntKey!=pCur->apP
229a0 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[i]->intKey )
229b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
229c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
229d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
229e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
229f0 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50   0./*.** Page pP
22a00 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
22a10 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
22a20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
22a30 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
22a40 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
22a50 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
22a60 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
22a70 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
22a80 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
22a90 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
22aa0 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
22ab0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
22ac0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
22ad0 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
22ae0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
22af0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
22b00 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
22b10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
22b20 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
22b30 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
22b40 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
22b50 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
22b60 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
22b70 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
22b80 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
22b90 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
22ba0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
22bb0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
22bc0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
22bd0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
22be0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
22bf0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
22c00 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
22c10 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
22c20 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
22c30 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
22c40 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
22c50 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
22c60 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
22c70 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
22c80 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
22c90 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
22ca0 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
22cb0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
22cc0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
22cd0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
22ce0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
22cf0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
22d00 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
22d10 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
22d20 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
22d30 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
22d40 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
22d50 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
22d60 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
22d70 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72  c void moveToPar
22d80 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ent(BtCursor *pC
22d90 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
22da0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
22db0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
22dc0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
22dd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
22de0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
22df0 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
22e00 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22e10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
22e20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54 45 3a  );..  /* UPDATE:
22e30 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20   It is actually 
22e40 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
22e50 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73 74 65   condition teste
22e60 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 0a  d by the assert.
22e70 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20 62 65    ** below to be
22e80 20 75 6e 74 72 75 65 20 69 66 20 74 68 65 20 64   untrue if the d
22e90 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
22ea0 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20 63 61  corrupt. This ca
22eb0 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a 2a 20  n occur if.  ** 
22ec0 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  one cursor has m
22ed0 6f 64 69 66 69 65 64 20 70 61 67 65 20 70 50 61  odified page pPa
22ee0 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72 65 66  rent while a ref
22ef0 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 73 20  erence to it is 
22f00 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20 61 20  held .  ** by a 
22f10 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e 20 57  second cursor. W
22f20 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61  hich can only ha
22f30 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67 6c 65  ppen if a single
22f40 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65 64 0a   page is linked.
22f50 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65 20 74    ** into more t
22f60 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73  han one b-tree s
22f70 74 72 75 63 74 75 72 65 20 69 6e 20 61 20 63 6f  tructure in a co
22f80 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20  rrupt database. 
22f90 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65   */.#if 0.  asse
22fa0 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
22fb0 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
22fc0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
22fd0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
22fe0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
22ff0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61   .    pCur->apPa
23000 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
23010 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e 64 69  >pgno.  );.#endi
23020 66 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  f.  testcase( pC
23030 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23040 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d  iPage-1] > pCur-
23050 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23060 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  age-1]->nCell );
23070 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ..  releasePage(
23080 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
23090 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70 43  r->iPage]);.  pC
230a0 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 70  ur->iPage--;.  p
230b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
230c0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
230d0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a 2f  idNKey = 0;.}../
230e0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
230f0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
23100 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
23110 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
23120 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
23130 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
23140 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
23150 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
23160 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
23170 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
23180 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
23190 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
231a0 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
231b0 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
231c0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
231d0 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
231e0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
231f0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
23200 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
23210 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
23220 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
23230 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
23240 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
23250 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
23260 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
23270 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
23280 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
23290 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
232a0 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
232b0 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
232c0 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
232d0 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
232e0 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
232f0 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
23300 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
23310 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
23320 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
23330 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
23340 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
23350 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
23360 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
23370 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
23380 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
23390 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
233a0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
233b0 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
233c0 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
233d0 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
233e0 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
233f0 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
23400 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
23410 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
23420 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
23430 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
23440 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
23450 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
23460 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
23470 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
23480 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
23490 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
234a0 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
234b0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
234c0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
234d0 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
234e0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
234f0 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
23500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
23510 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
23520 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
23530 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
23540 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23550 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
23560 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
23570 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23580 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
23590 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
235a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
235b0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
235c0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
235d0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
235e0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
235f0 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
23600 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
23610 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
23620 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
23630 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
23640 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
23650 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
23660 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
23670 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23680 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
23690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
236a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
236b0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
236c0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
236d0 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
236e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
236f0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
23700 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
23710 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
23720 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
23730 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=1; i<=pCur->i
23740 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
23750 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
23760 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
23770 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
23780 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  iPage = 0;.  }el
23790 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
237a0 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
237b0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
237c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
237d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
237e0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
237f0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
23800 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
23810 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
23820 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20  ->apPage[0]);.  
23830 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23840 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
23850 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
23860 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
23870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23880 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
23890 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  ge = 0;..    /* 
238a0 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  If pCur->pKeyInf
238b0 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  o is not NULL, t
238c0 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74  hen the caller t
238d0 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20  hat opened this 
238e0 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78  cursor.    ** ex
238f0 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
23900 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
23910 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
23920 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
23930 20 20 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65      ** NULL, the
23940 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
23950 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
23960 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
23970 68 65 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20  he case,.    ** 
23980 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
23990 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
239a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
239b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
239c0 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43  >intKey==1 || pC
239d0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
239e0 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20  ntKey==0 );.    
239f0 69 66 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49  if( (pCur->pKeyI
23a00 6e 66 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61  nfo==0)!=pCur->a
23a10 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
23a20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
23a30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
23a40 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
23a50 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
23a60 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
23a70 69 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63  is of the correc
23a80 74 20 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73  t type. This mus
23a90 74 20 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61  t be the.  ** ca
23aa0 73 65 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74  se as the call t
23ab0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
23ac0 74 68 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20  that loaded the 
23ad0 72 6f 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65  root-page (eithe
23ae0 72 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c  r.  ** this call
23af0 20 6f 72 20 61 20 70 72 65 76 69 6f 75 73 20 69   or a previous i
23b00 6e 76 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64  nvocation) would
23b10 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
23b20 6f 72 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20  orruption .  ** 
23b30 69 66 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f  if the assumptio
23b40 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c  n were not true,
23b50 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70   and it is not p
23b60 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
23b70 66 6c 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65  flags .  ** byte
23b80 20 74 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f   to have been mo
23b90 64 69 66 69 65 64 20 77 68 69 6c 65 20 74 68 69  dified while thi
23ba0 73 20 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64  s cursor is hold
23bb0 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a  ing a reference.
23bc0 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
23bd0 2e 20 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20  .  */.  pRoot = 
23be0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
23bf0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
23c00 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67  ->pgno==pCur->pg
23c10 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65  noRoot );.  asse
23c20 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69  rt( pRoot->isIni
23c30 74 20 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79  t && (pCur->pKey
23c40 49 6e 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d  Info==0)==pRoot-
23c50 3e 69 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43  >intKey );..  pC
23c60 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
23c70 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
23c80 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
23c90 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
23ca0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
23cb0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  = 0;..  if( pRoo
23cc0 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21  t->nCell==0 && !
23cd0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
23ce0 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
23cf0 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
23d00 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
23d10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
23d20 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
23d30 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
23d40 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
23d50 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
23d60 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
23d70 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
23d80 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
23d90 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
23da0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
23db0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
23dc0 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c   = ((pRoot->nCel
23dd0 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
23de0 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
23df0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23e00 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
23e10 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
23e20 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
23e30 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
23e40 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
23e50 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
23e60 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
23e70 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
23e80 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
23e90 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
23ea0 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
23eb0 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
23ec0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
23ed0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
23ee0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
23ef0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23f00 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
23f10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23f20 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
23f30 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
23f40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23f50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23f60 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
23f70 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
23f80 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
23f90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
23fa0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
23fb0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23fc0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
23fd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
23fe0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
23ff0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
24000 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
24010 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
24020 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
24030 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
24040 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
24050 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
24060 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
24070 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
24080 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
24090 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
240a0 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
240b0 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
240c0 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
240d0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
240e0 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
240f0 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
24100 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
24110 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
24120 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
24130 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
24140 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
24150 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
24160 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
24170 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
24180 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
24190 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
241a0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
241b0 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
241c0 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
241d0 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
241e0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
241f0 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
24200 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
24210 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
24220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
24230 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
24240 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
24250 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
24260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24270 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24280 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
24290 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
242a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
242b0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
242c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
242d0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
242e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
242f0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
24300 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24310 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
24320 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
24330 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
24340 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
24350 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
24360 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
24370 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
24380 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
24390 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
243a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
243b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
243c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
243d0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
243e0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
243f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
24400 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
24410 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
24420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24430 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
24440 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
24450 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
24460 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
24470 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
24480 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
24490 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
244a0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
244b0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
244c0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
244d0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
244e0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
244f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
24500 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
24510 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
24520 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
24530 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
24540 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
24550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
24560 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
24570 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
24580 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
24590 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
245a0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
245b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
245c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
245d0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
245e0 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
245f0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
24600 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
24610 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
24620 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
24630 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
24640 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24650 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
24660 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
24670 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
24680 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
24690 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
246a0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
246b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
246c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
246d0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
246e0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
246f0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
24700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
24710 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
24720 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
24730 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
24740 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
24750 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
24760 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
24770 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
24780 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
24790 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
247a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
247b0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
247c0 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
247d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
247e0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
247f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
24800 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
24810 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
24820 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
24830 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
24840 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
24850 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
24860 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
24870 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
24880 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
24890 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b   pCur->atLast ){
248a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
248b0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
248c0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
248d0 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
248e0 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
248f0 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
24900 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
24910 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
24920 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
24930 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
24940 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
24950 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
24960 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
24970 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
24980 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
24990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
249a0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
249b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70  [pCur->iPage]==p
249c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
249d0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d  ->iPage]->nCell-
249e0 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
249f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24a00 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
24a10 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72   );.#endif.    r
24a20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24a30 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
24a40 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
24a50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24a60 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55  OK ){.    if( CU
24a70 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
24a80 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
24a90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24aa0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
24ab0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24ac0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
24ad0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
24ae0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
24af0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
24b00 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24b10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24b20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
24b30 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
24b40 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
24b50 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
24b60 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49  tLast = rc==SQLI
24b70 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20  TE_OK ?1:0;.    
24b80 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
24b90 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
24ba0 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
24bb0 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
24bc0 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
24bd0 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
24be0 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20  d by pIdxKey or 
24bf0 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e  intKey.   Return
24c00 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e   a success code.
24c10 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45  .**.** For INTKE
24c20 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e  Y tables, the in
24c30 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  tKey parameter i
24c40 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79  s used.  pIdxKey
24c50 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c   .** must be NUL
24c60 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
24c70 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73  bles, pIdxKey is
24c80 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79   used and intKey
24c90 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a  .** is ignored..
24ca0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63  **.** If an exac
24cb0 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66  t match is not f
24cc0 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63  ound, then the c
24cd0 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a  ursor is always.
24ce0 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  ** left pointing
24cf0 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20   at a leaf page 
24d00 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64  which would hold
24d10 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74   the entry if it
24d20 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74  .** were present
24d30 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69  .  The cursor mi
24d40 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  ght point to an 
24d50 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73  entry that comes
24d60 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66  .** before or af
24d70 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ter the key..**.
24d80 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73  ** An integer is
24d90 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
24da0 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65  Res which is the
24db0 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f   result of.** co
24dc0 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
24dd0 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
24de0 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73  o which the curs
24df0 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69  or is .** pointi
24e00 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67  ng.  The meaning
24e10 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20   of the integer 
24e20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
24e30 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c  *pRes is as foll
24e40 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ows:.**.**     *
24e50 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20  pRes<0      The 
24e60 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
24e70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
24e80 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
24ea0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74  smaller than int
24eb0 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69  Key/pIdxKey or i
24ec0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
24ed0 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20  mpty.**         
24ee0 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65           and the
24ef0 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65   cursor is there
24f00 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20  fore left point 
24f10 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  to nothing..**.*
24f20 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20  *     *pRes==0  
24f30 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
24f40 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
24f50 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
24f60 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
24f70 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63      exactly matc
24f80 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  hes intKey/pIdxK
24f90 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ey..**.**     *p
24fa0 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63  Res>0      The c
24fb0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
24fc0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
24fd0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c              is l
24ff0 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  arger than intKe
25000 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f  y/pIdxKey..**.*/
25010 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25020 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
25030 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
25040 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
25050 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
25060 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
25070 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
25080 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
25090 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
250a0 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
250b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
250c0 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
250d0 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
250e0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
250f0 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
25100 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
25110 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
25120 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
25130 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
25140 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
25150 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  .){.  int rc;.. 
25160 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25170 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
25190 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
251a0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
251b0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
251c0 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20  sert( pRes );.  
251d0 61 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79  assert( (pIdxKey
251e0 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65  ==0)==(pCur->pKe
251f0 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20  yInfo==0) );..  
25200 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
25210 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
25220 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
25230 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
25240 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
25250 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
25260 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
25270 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
25280 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
25290 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
252a0 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65  & pCur->validNKe
252b0 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 61  y .   && pCur->a
252c0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
252d0 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70   .  ){.    if( p
252e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
252f0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
25300 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
25310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25320 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
25330 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 26 26   pCur->atLast &&
25340 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
25350 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
25360 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
25370 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25380 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
25390 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
253a0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
253b0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
253c0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
253d0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
253e0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
253f0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25400 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25410 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
25420 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
25430 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
25440 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
25450 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25460 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
25470 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
25480 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
25490 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43  ll>0 );.  if( pC
254a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
254b0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
254c0 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
254d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
254e0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
254f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25500 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
25510 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
25520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
25530 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25540 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
25550 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
25560 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
25570 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
25580 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
25590 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
255a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
255b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
255c0 5d 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20  ];.    int c;.. 
255d0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
255e0 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
255f0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
25600 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
25610 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
25620 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
25630 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
25640 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
25650 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
25660 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
25670 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
25680 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
25690 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
256a0 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
256b0 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
256c0 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
256d0 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
256e0 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
256f0 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
25700 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
25710 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
25720 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
25730 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
25740 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
25750 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
25760 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
25770 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
25780 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
25790 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
257a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
257b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
257c0 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
257d0 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
257e0 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
257f0 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69  ll-1;.    if( bi
25800 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  asRight ){.     
25810 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
25820 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
25830 29 28 69 64 78 20 3d 20 75 70 72 29 3b 0a 20 20  )(idx = upr);.  
25840 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
25850 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
25860 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
25870 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f  idx = (upr+lwr)/
25880 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  2);.    }.    fo
25890 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 75 38 20  r(;;){.      u8 
258a0 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  *pCell;         
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
258d0 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70  urrent cell in p
258e0 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61  Page */..      a
258f0 73 73 65 72 74 28 20 69 64 78 3d 3d 70 43 75 72  ssert( idx==pCur
25900 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25910 61 67 65 5d 20 29 3b 0a 20 20 20 20 20 20 70 43  age] );.      pC
25920 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
25930 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   0;.      pCell 
25940 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
25950 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
25960 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
25970 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
25980 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
25990 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
259a0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
259b0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
259c0 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79         u32 dummy
259d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
259e0 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  l += getVarint32
259f0 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a  (pCell, dummy);.
25a00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25a10 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
25a20 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
25a30 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
25a40 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
25a50 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
25a60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
25a70 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
25a80 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
25a90 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
25aa0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
25ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
25ac0 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b  ellKey>intKey );
25ad0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
25ae0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
25af0 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
25b00 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  NKey = 1;.      
25b10 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
25b20 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
25b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25b40 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
25b50 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
25b60 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62  -size is 65536 b
25b70 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
25b80 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
25b90 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
25ba0 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
25bb0 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
25bc0 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
25bd0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
25be0 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34   less than 16384
25bf0 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62   bytes and may b
25c00 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
25c10 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
25c20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
25c30 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
25c40 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
25c50 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
25c60 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
25c70 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
25c80 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
25c90 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
25ca0 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
25cb0 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
25cc0 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
25cd0 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
25ce0 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
25cf0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
25d00 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
25d10 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
25d20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20        int nCell 
25d30 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
25d40 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
25d50 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
25d60 79 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 2f  yload.         /
25d70 2a 20 26 26 20 28 70 43 65 6c 6c 2b 6e 43 65 6c  * && (pCell+nCel
25d80 6c 29 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 45  l)<pPage->aDataE
25d90 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b  nd */.        ){
25da0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
25db0 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
25dc0 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
25dd0 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
25de0 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
25df0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
25e00 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
25e10 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
25e20 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
25e30 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
25e40 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
25e50 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
25e60 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
25e70 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  1==pPage->aDataE
25e80 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
25e90 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  c = sqlite3VdbeR
25ea0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
25eb0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
25ec0 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
25ed0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
25ee0 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
25ef0 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
25f00 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
25f10 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
25f20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
25f30 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
25f40 20 20 20 20 20 2f 2a 20 26 26 20 28 70 43 65 6c       /* && (pCel
25f50 6c 2b 6e 43 65 6c 6c 2b 32 29 3c 3d 70 50 61 67  l+nCell+2)<=pPag
25f60 65 2d 3e 61 44 61 74 61 45 6e 64 20 2a 2f 0a 20  e->aDataEnd */. 
25f70 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
25f80 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
25f90 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20  d-size field is 
25fa0 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20  a 2 byte varint 
25fb0 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a  and the record .
25fc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74            ** fit
25fd0 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68  s entirely on th
25fe0 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61  e main b-tree pa
25ff0 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
26000 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
26010 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65  l+nCell+2==pPage
26020 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
26030 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
26040 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
26050 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
26060 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
26070 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
26080 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
26090 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
260a0 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
260b0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
260c0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
260d0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
260e0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
260f0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
26100 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
26110 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
26120 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
26130 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
26140 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
26150 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
26160 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
26170 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
26180 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
26190 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
261a0 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
261b0 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
261c0 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
261d0 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
261e0 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
261f0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
26200 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
26210 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
26220 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
26230 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
26240 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
26250 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
26260 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
26270 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
26280 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ( nCell );.     
26290 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
262a0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
262b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
262c0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
262d0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
262e0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
262f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
26300 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
26310 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
26320 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
26330 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
26340 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
26350 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
26360 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
26370 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
26380 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
26390 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
263a0 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  }.          c = 
263b0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
263c0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
263d0 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65  pCellKey, pIdxKe
263e0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  y);.          sq
263f0 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c  lite3_free(pCell
26400 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Key);.        }.
26410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
26420 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
26430 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
26440 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
26450 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
26460 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20   lwr = idx;.    
26470 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26480 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26490 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
264a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
264b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
264c0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
264d0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
264e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
264f0 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
26500 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
26510 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26520 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
26530 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
26540 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a   if( lwr>upr ){.
26550 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26560 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
26570 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26580 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64  Page] = (u16)(id
26590 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 29  x = (lwr+upr)/2)
265a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
265b0 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c  rt( lwr==upr+1 |
265c0 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  | (pPage->intKey
265d0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
265e0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
265f0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
26600 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
26610 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63  >leaf ){.      c
26620 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d  hldPg = 0;.    }
26630 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50  else if( lwr>=pP
26640 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
26650 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
26660 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
26670 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
26680 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
26690 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
266a0 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
266b0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
266c0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
266d0 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20  ( chldPg==0 ){. 
266e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
266f0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
26700 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
26710 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
26720 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
26730 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
26740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26750 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
26760 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
26770 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
26780 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
26790 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43  (u16)lwr;.    pC
267a0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
267b0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
267c0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20  lidNKey = 0;.   
267d0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
267e0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
267f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
26800 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
26810 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
26820 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ish:.  return rc
26830 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
26840 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63  rn TRUE if the c
26850 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
26860 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
26870 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a  y of the table..
26880 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20  **.** TRUE will 
26890 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65  be returned afte
268a0 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  r a call to sqli
268b0 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d  te3BtreeNext() m
268c0 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65  oves.** past the
268d0 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
268e0 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69  he table or sqli
268f0 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d  te3BtreePrev() m
26900 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65  oves past.** the
26910 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54   first entry.  T
26920 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75  RUE is also retu
26930 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c  rned if the tabl
26940 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
26950 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  nt sqlite3BtreeE
26960 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  of(BtCursor *pCu
26970 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57  r){.  /* TODO: W
26980 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f  hat if the curso
26990 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52  r is in CURSOR_R
269a0 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61  EQUIRESEEK but a
269b0 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ll table entries
269c0 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
269d0 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50  deleted? This AP
269e0 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63  I will need to c
269f0 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20  hange to return 
26a00 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20  an error code.  
26a10 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68  ** as well as th
26a20 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74  e boolean result
26a30 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72   value..  */.  r
26a40 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41  eturn (CURSOR_VA
26a50 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID!=pCur->eStat
26a60 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76  e);.}../*.** Adv
26a70 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20  ance the cursor 
26a80 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
26a90 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
26aa0 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
26ab0 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
26ac0 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
26ad0 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
26ae0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
26af0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
26b00 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
26b10 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
26b20 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
26b30 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
26b40 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
26b50 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
26b60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
26b70 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
26b80 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
26b90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
26ba0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
26bb0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
26bc0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
26bd0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
26be0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
26bf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26c00 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26c10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65   }.  assert( pRe
26c20 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55  s!=0 );.  if( CU
26c30 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
26c40 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
26c50 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
26c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26c70 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
26c80 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
26c90 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
26ca0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  ext = 0;.    *pR
26cb0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
26cc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
26cd0 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  }.  pCur->skipNe
26ce0 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  xt = 0;..  pPage
26cf0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
26d00 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
26d10 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69  idx = ++pCur->ai
26d20 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
26d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26d40 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20  e->isInit );..  
26d50 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
26d60 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75  se file is corru
26d70 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  pt, it is possib
26d80 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  le for the value
26d90 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f   of idx .  ** to
26da0 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65   be invalid here
26db0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
26dc0 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e  occur if a secon
26dd0 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65  d cursor modifie
26de0 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  s.  ** the page 
26df0 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75  while cursor pCu
26e00 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72  r is holding a r
26e10 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20  eference to it. 
26e20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f  Which can.  ** o
26e30 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
26e40 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
26e50 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20  rrupt in such a 
26e60 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74  way as to link t
26e70 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74  he.  ** page int
26e80 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
26e90 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
26ea0 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  . */.  testcase(
26eb0 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c   idx>pPage->nCel
26ec0 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  l );..  pCur->in
26ed0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26ee0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
26ef0 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d  = 0;.  if( idx>=
26f00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
26f10 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
26f20 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
26f30 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
26f40 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
26f50 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
26f60 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
26f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
26f80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
26f90 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
26fa0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
26fb0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
26fc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
26fd0 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
26fe0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
26ff0 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
27000 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
27010 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
27020 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
27030 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
27040 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
27050 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
27060 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
27070 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
27080 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27090 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68  >iPage];.    }wh
270a0 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
270b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
270c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
270d0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
270e0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
270f0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Key ){.      rc 
27100 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  = sqlite3BtreeNe
27110 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
27120 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27140 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
27150 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  n rc;.  }.  *pRe
27160 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  s = 0;.  if( pPa
27170 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
27180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27190 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76  ;.  }.  rc = mov
271a0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
271b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
271c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  }.../*.** Step t
271d0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
271e0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
271f0 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
27200 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
27210 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
27220 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
27230 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
27240 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
27250 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
27260 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
27270 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
27280 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
27290 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
272a0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
272b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
272c0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
272d0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
272e0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
272f0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
27300 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
27310 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27320 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
27330 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
27340 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
27350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27360 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
27370 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61  c;.  }.  pCur->a
27380 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28  tLast = 0;.  if(
27390 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
273a0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
273b0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
273c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
273d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
273e0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
273f0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   ){.    pCur->sk
27400 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
27410 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
27420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
27430 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
27440 70 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50  pNext = 0;..  pP
27450 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27460 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
27470 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27480 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
27490 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
274a0 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
274b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
274c0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
274d0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
274e0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
274f0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
27500 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
27510 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27520 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
27530 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
27540 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
27550 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
27560 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27570 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
27580 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
27590 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
275a0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
275b0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
275c0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
275d0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
275e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
275f0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
27600 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
27610 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
27620 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
27630 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
27640 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43  Key = 0;..    pC
27650 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27660 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
27670 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
27680 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
27690 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
276a0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
276b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
276c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
276d0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
276e0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
276f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
27700 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
27710 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
27720 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27730 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
27740 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
27750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
27760 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
27770 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
27780 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
27790 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
277a0 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
277b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
277c0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
277d0 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
277e0 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
277f0 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
27800 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
27810 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
27820 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
27830 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
27840 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
27850 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
27860 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
27870 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
27880 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
27890 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
278a0 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
278b0 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
278c0 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
278d0 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75  and *pPgno are u
278e0 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20  ndefined in the 
278f0 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
27900 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76  r..** Do not inv
27910 6f 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72  oke sqlite3Pager
27920 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61  Unref() on *ppPa
27930 67 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69  ge if an error i
27940 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
27950 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
27960 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
27970 6f 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65  ot 0, then a (fe
27980 65 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20  eble) effort is 
27990 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61  made to .** loca
279a0 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20  te a page close 
279b0 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  to the page numb
279c0 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68  er "nearby".  Th
279d0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69  is can be used i
279e0 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20  n an.** attempt 
279f0 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20  to keep related 
27a00 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65  pages close to e
27a10 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65  ach other in the
27a20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a   database file,.
27a30 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e  ** which in turn
27a40 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61   can make databa
27a50 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72  se access faster
27a60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
27a70 65 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72  exact" parameter
27a80 20 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74   is not 0, and t
27a90 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e  he page-number n
27aa0 65 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a  earby exists .**
27ab0 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
27ac0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
27ad0 20 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65   it is guarentee
27ae0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
27af0 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c  . This.** is onl
27b00 79 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  y used by auto-v
27b10 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20  acuum databases 
27b20 77 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20  when allocating 
27b30 61 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a  a new table..*/.
27b40 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
27b50 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
27b60 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a  BtShared *pBt, .
27b70 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
27b80 67 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ge, .  Pgno *pPg
27b90 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72  no, .  Pgno near
27ba0 62 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29  by,.  u8 exact.)
27bb0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
27bc0 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
27bd0 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
27be0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
27bf0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
27c00 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
27c10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
27c20 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
27c30 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
27c40 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
27c50 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
27c60 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
27c70 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
27c80 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
27c90 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
27ca0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
27cb0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27cc0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
27cd0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
27ce0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
27cf0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
27d00 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
27d10 29 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74  );.  n = get4byt
27d20 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
27d30 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73  [36]);.  testcas
27d40 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29  e( n==mxPage-1 )
27d50 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67  ;.  if( n>=mxPag
27d60 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
27d70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
27d80 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  KPT;.  }.  if( n
27d90 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >0 ){.    /* The
27da0 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20  re are pages on 
27db0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
27dc0 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73  euse one of thos
27dd0 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20  e pages. */.    
27de0 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20  Pgno iTrunk;.   
27df0 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d   u8 searchList =
27e00 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72   0; /* If the fr
27e10 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20  ee-list must be 
27e20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65  searched for 'ne
27e30 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20  arby' */.    .  
27e40 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61    /* If the 'exa
27e50 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61  ct' parameter wa
27e60 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65  s true and a que
27e70 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
27e80 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
27e90 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
27ea0 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
27eb0 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
27ec0 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
27ed0 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
27ee0 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
27ef0 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
27f00 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
27f10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27f20 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
27f30 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72  f( exact && near
27f40 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20  by<=mxPage ){.  
27f50 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
27f60 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72      assert( near
27f70 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  by>0 );.      as
27f80 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
27f90 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72  acuum );.      r
27fa0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
27fb0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
27fc0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
27fd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
27fe0 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
27ff0 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
28000 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61  E ){.        sea
28010 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
28020 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e     }.      *pPgn
28030 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20  o = nearby;.    
28040 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
28050 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
28060 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
28070 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
28080 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
28090 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
280a0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
280b0 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
280c0 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
280d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
280e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
280f0 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
28100 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
28110 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
28120 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
28130 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
28140 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
28150 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
28160 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
28170 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
28180 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
28190 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
281a0 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
281b0 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
281c0 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
281d0 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
281e0 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
281f0 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
28200 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e  rby' is located.
28210 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
28220 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
28230 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
28240 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
28250 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75   ){.        iTru
28260 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
28270 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
28280 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [0]);.      }els
28290 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  e{.        iTrun
282a0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
282b0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
282c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
282d0 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
282e0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
282f0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
28300 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  age ){.        r
28310 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
28320 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
28330 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
28340 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
28350 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
28360 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
28370 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
28380 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  {.        pTrunk
28390 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 0;.        go
283a0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
283b0 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  page;.      }.  
283c0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
283d0 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  nk!=0 );.      a
283e0 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61  ssert( pTrunk->a
283f0 44 61 74 61 21 3d 30 20 29 3b 0a 0a 20 20 20 20  Data!=0 );..    
28400 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
28410 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
28420 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61 76 65  ); /* # of leave
28430 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e 6b 20  s on this trunk 
28440 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
28450 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63  ( k==0 && !searc
28460 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  hList ){.       
28470 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61   /* The trunk ha
28480 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20  s no leaves and 
28490 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20  the list is not 
284a0 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20  being searched. 
284b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65  .        ** So e
284c0 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b  xtract the trunk
284d0 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64   page itself and
284e0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e   use it as the n
284f0 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  ewly .        **
28500 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
28510 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
28520 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30  t( pPrevTrunk==0
28530 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
28540 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28550 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
28560 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
28570 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
28580 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
28590 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
285a0 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e   }.        *pPgn
285b0 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  o = iTrunk;.    
285c0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
285d0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26  e1->aData[32], &
285e0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
285f0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  , 4);.        *p
28600 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a  pPage = pTrunk;.
28610 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
28620 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
28630 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
28640 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
28650 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
28660 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  *pPgno, n-1));. 
28670 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b       }else if( k
28680 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62  >(u32)(pBt->usab
28690 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b  leSize/4 - 2) ){
286a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75  .        /* Valu
286b0 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66  e of k is out of
286c0 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73   range.  Databas
286d0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  e corruption */.
286e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
286f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28700 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
28710 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
28720 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
28730 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
28740 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
28750 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e   searchList && n
28760 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b  earby==iTrunk ){
28770 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
28780 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
28790 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
287a0 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
287b0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
287c0 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
287d0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
287e0 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
287f0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
28800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a         assert( *
28810 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b  pPgno==iTrunk );
28820 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
28830 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
28840 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
28850 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
28860 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28870 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
28880 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
28890 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
288a0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
288b0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
288c0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
288d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
288e0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
288f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
28900 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
28910 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
28920 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
28930 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
28940 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
28950 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28960 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
28970 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
28980 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
289a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
289b0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
289c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
289d0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
289e0 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
289f0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
28a00 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
28a10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28a20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28a30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
28a40 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
28a50 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
28a60 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
28a70 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
28a80 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
28a90 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
28aa0 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
28ab0 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
28ac0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
28ad0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
28ae0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
28af0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
28b00 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
28b10 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
28b20 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
28b30 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
28b40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
28b50 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
28b60 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
28b70 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
28b80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
28b90 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
28ba0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
28bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28bc0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65     testcase( iNe
28bd0 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  wTrunk==mxPage )
28be0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
28bf0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
28c00 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70  t, iNewTrunk, &p
28c10 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20  NewTrunk, 0);.  
28c20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
28c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28c40 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
28c50 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
28c60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28c70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28c80 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
28c90 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  ewTrunk->pDbPage
28ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28cb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
28cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
28cd0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
28ce0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
28cf0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
28d00 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
28d10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28d20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e  memcpy(&pNewTrun
28d30 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
28d40 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
28d50 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  4);.          pu
28d60 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e  t4byte(&pNewTrun
28d70 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  k->aData[4], k-1
28d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
28d90 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
28da0 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e  aData[8], &pTrun
28db0 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b  k->aData[12], (k
28dc0 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20  -1)*4);.        
28dd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
28de0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
28df0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
28e00 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
28e10 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
28e20 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
28e30 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  le(pPage1->pDbPa
28e40 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ge) );.         
28e50 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
28e60 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
28e70 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
28e80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28e90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28ea0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28eb0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50  pPrevTrunk->pDbP
28ec0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
28ed0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
28ee0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
28ef0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
28f00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
28f10 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
28f20 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
28f30 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77  ->aData[0], iNew
28f40 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
28f50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28f60 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
28f70 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28  ;.        TRACE(
28f80 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74  ("ALLOCATE: %d t
28f90 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70  runk - %d free p
28fa0 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70  ages left\n", *p
28fb0 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e  Pgno, n-1));.#en
28fc0 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  dif.      }else 
28fd0 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20  if( k>0 ){.     
28fe0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20     /* Extract a 
28ff0 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72  leaf from the tr
29000 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  unk */.        u
29010 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20  32 closest;.    
29020 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a      Pgno iPage;.
29030 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
29040 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70   char *aData = p
29050 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20  Trunk->aData;.  
29060 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
29070 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
29080 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
29090 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
290a0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
290b0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
290c0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
290d0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
290e0 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
290f0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
29100 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
29110 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
29120 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  d2 = sqlite3AbsI
29130 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
29140 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
29150 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
29160 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
29170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29180 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
29190 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
291a0 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
291b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
291c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
291d0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
291e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
291f0 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
29200 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
29210 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
29220 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
29230 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
29240 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
29250 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
29260 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
29270 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29280 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  PT;.          go
29290 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
292a0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
292b0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
292c0 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20  ( iPage==mxPage 
292d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
292e0 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50  searchList || iP
292f0 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age==nearby ){. 
29300 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43           int noC
29310 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  ontent;.        
29320 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65    *pPgno = iPage
29330 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  ;.          TRAC
29340 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
29350 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
29360 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29380 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
29390 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
293a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
293b0 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
293c0 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
293d0 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
293e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
293f0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
29400 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
29410 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
29420 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
29430 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  age;.          i
29440 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29  f( closest<k-1 )
29450 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
29460 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c  mcpy(&aData[8+cl
29470 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61  osest*4], &aData
29480 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20  [4+k*4], 4);.   
29490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
294a0 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61     put4byte(&aDa
294b0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
294c0 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
294d0 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
294e0 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
294f0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
29500 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
29510 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
29520 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
29530 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29550 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
29560 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
29570 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
29580 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
29590 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
295a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
295b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
295c0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
295d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
295e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
295f0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
29600 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29610 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
29620 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
29630 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
29640 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
29650 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
29660 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29670 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
29680 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
29690 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65  elist, so create
296a0 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74   a new page at t
296b0 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66  he.    ** end of
296c0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
296d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
296e0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
296f0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
29700 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29710 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e  rn rc;.    pBt->
29720 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28  nPage++;.    if(
29730 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
29740 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
29750 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  Bt) ) pBt->nPage
29760 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ++;..#ifndef SQL
29770 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
29780 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
29790 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
297a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
297b0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b  , pBt->nPage) ){
297c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
297d0 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
297e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
297f0 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
29800 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
29810 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
29820 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
29830 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
29840 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
29850 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
29860 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
29870 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
29880 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
29890 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
298a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50     */.      MemP
298b0 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20  age *pPg = 0;.  
298c0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
298d0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
298e0 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74  d of file (point
298f0 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c  er-map page)\n",
29900 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20   pBt->nPage));. 
29910 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
29920 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47  ->nPage!=PENDING
29930 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
29940 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  );.      rc = bt
29950 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
29960 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67  pBt->nPage, &pPg
29970 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
29980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29990 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
299a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
299b0 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pPg->pDbPage);. 
299c0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
299d0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ge(pPg);.      }
299e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
299f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29a00 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
29a10 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
29a20 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
29a30 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20 70  E_PAGE(pBt) ){ p
29a40 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20  Bt->nPage++; }. 
29a50 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
29a60 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28 75  put4byte(28 + (u
29a70 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  8*)pBt->pPage1->
29a80 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67  aData, pBt->nPag
29a90 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  e);.    *pPgno =
29aa0 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20   pBt->nPage;..  
29ab0 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
29ac0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
29ad0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
29ae0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
29af0 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70  e(pBt, *pPgno, p
29b00 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20 69  pPage, 1);.    i
29b10 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
29b20 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
29b30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
29b40 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
29b50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29b70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
29b80 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
29b90 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
29ba0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
29bb0 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
29bc0 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
29bd0 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
29be0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
29bf0 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
29c00 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
29c10 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
29c20 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
29c30 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69  pPrevTrunk);.  i
29c40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
29c50 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
29c60 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
29c70 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e  ount((*ppPage)->
29c80 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20  pDbPage)>1 ){.  
29c90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
29ca0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
29cb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
29cc0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
29cd0 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
29ce0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
29cf0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
29d00 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
29d10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
29d20 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
29d30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a  erIswriteable((*
29d40 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
29d50 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
29d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
29d70 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
29d80 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
29d90 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
29da0 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
29db0 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
29dc0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
29dd0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
29de0 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
29df0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
29e00 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
29e10 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
29e20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
29e30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
29e40 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
29e50 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
29e60 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
29e70 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
29e80 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
29e90 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
29ea0 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
29eb0 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
29ec0 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
29ed0 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
29ee0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
29ef0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
29f00 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
29f10 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
29f20 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
29f30 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
29f40 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
29f50 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
29f60 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
29f70 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
29f80 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
29f90 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
29fa0 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
29fb0 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
29fc0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
29fd0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
29fe0 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
29ff0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
2a000 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
2a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a020 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2a030 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
2a040 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
2a050 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
2a060 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
2a070 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
2a080 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2a090 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2a0a0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2a0b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2a0c0 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
2a0d0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
2a0e0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a100 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2a110 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
2a120 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a140 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2a150 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
2a160 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
2a170 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2a180 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2a190 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
2a1a0 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
2a1b0 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
2a1c0 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
2a1d0 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
2a1e0 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
2a1f0 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
2a200 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
2a210 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
2a220 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
2a230 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
2a240 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2a250 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
2a260 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2a270 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
2a280 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
2a290 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2a2a0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2a2b0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2a2c0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2a2d0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
2a2e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2a2f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2a300 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2a310 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2a320 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
2a330 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2a340 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
2a350 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
2a360 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
2a370 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2a380 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
2a390 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
2a3a0 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
2a3b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
2a3c0 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
2a3d0 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
2a3e0 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
2a3f0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
2a400 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
2a410 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
2a420 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
2a430 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2a440 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2a450 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
2a460 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2a470 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
2a480 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
2a490 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
2a4a0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
2a4b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2a4c0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2a4d0 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
2a4e0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
2a4f0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2a500 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2a510 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2a520 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
2a530 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2a540 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
2a550 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
2a560 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
2a570 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
2a580 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2a590 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2a5a0 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
2a5b0 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
2a5c0 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
2a5d0 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
2a5e0 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
2a5f0 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
2a600 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
2a610 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
2a620 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
2a630 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
2a640 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2a650 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
2a660 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2a670 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
2a680 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2a690 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
2a6a0 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
2a6b0 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
2a6c0 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
2a6d0 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
2a6e0 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
2a6f0 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
2a700 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
2a710 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
2a720 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
2a730 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
2a740 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
2a750 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
2a760 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2a770 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
2a780 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
2a790 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
2a7a0 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
2a7b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2a7c0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2a7d0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2a7e0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
2a7f0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
2a800 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2a810 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2a820 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2a830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
2a840 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
2a850 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2a860 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
2a870 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
2a880 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
2a890 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
2a8a0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
2a8b0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2a8c0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2a8d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
2a8e0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2a8f0 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
2a900 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
2a910 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
2a920 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
2a930 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
2a940 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
2a950 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
2a960 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
2a970 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
2a980 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
2a990 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
2a9a0 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
2a9b0 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
2a9c0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
2a9d0 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
2a9e0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2a9f0 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
2aa00 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
2aa10 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
2aa20 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
2aa30 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
2aa40 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
2aa50 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
2aa60 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
2aa70 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
2aa80 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
2aa90 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2aaa0 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
2aab0 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
2aac0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
2aad0 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
2aae0 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
2aaf0 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
2ab00 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
2ab10 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
2ab20 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
2ab30 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
2ab40 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
2ab50 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
2ab60 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
2ab70 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2ab80 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
2ab90 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
2aba0 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
2abb0 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
2abc0 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
2abd0 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
2abe0 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
2abf0 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
2ac00 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
2ac10 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
2ac20 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
2ac30 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
2ac40 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
2ac50 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
2ac60 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
2ac70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2ac80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2ac90 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
2aca0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2acb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2acc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
2acd0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2ace0 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
2acf0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
2ad00 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
2ad10 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
2ad20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
2ad30 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
2ad40 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
2ad50 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
2ad60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ad70 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
2ad80 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
2ad90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
2ada0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
2adb0 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
2adc0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
2add0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
2ade0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
2adf0 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
2ae00 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
2ae10 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
2ae20 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
2ae30 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2ae40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2ae50 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
2ae60 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
2ae70 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
2ae80 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
2ae90 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
2aea0 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
2aeb0 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
2aec0 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
2aed0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
2aee0 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
2aef0 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
2af00 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
2af10 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
2af20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
2af30 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
2af40 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
2af50 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
2af60 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
2af70 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
2af80 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
2af90 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
2afa0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
2afb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
2afc0 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
2afd0 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
2afe0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
2aff0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
2b000 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
2b010 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
2b020 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b030 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2b040 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
2b050 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b060 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2b070 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
2b080 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
2b090 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
2b0a0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2b0b0 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
2b0c0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2b0d0 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
2b0e0 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
2b0f0 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
2b100 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
2b110 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
2b120 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
2b130 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
2b140 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
2b150 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
2b160 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
2b170 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2b180 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2b190 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
2b1a0 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
2b1b0 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
2b1c0 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
2b1d0 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
2b1e0 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
2b1f0 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
2b200 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
2b210 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
2b220 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
2b230 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
2b240 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
2b250 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2b260 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73  given Cell..*/.s
2b270 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
2b280 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
2b290 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ge, unsigned cha
2b2a0 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53  r *pCell){.  BtS
2b2b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
2b2c0 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
2b2d0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
2b2e0 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
2b2f0 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
2b300 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
2b310 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
2b320 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2b330 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2b340 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65  mutex) );.  btre
2b350 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2b360 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
2b370 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  o);.  if( info.i
2b380 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
2b390 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b3a0 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
2b3b0 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
2b3c0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
2b3d0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
2b3e0 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
2b3f0 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
2b400 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
2b410 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
2b420 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b430 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a 20 43  E_CORRUPT;  /* C
2b440 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74  ell extends past
2b450 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a   end of page */.
2b460 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
2b470 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
2b480 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2b490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
2b4a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34  ->usableSize > 4
2b4b0 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69   );.  ovflPageSi
2b4c0 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
2b4d0 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66  Size - 4;.  nOvf
2b4e0 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f  l = (info.nPaylo
2b4f0 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ad - info.nLocal
2b500 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20   + ovflPageSize 
2b510 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a  - 1)/ovflPageSiz
2b520 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66  e;.  assert( ovf
2b530 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66  lPgno==0 || nOvf
2b540 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
2b550 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
2b560 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
2b570 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
2b580 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
2b590 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
2b5a0 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
2b5b0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
2b5c0 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
2b5d0 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
2b5e0 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
2b5f0 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
2b600 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
2b610 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
2b620 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
2b630 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
2b640 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
2b650 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
2b660 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
2b670 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
2b680 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b690 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2b6a0 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
2b6b0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
2b6c0 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
2b6d0 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
2b6e0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
2b6f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2b700 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2b710 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
2b720 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
2b730 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
2b740 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
2b750 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
2b760 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
2b770 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
2b780 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
2b790 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
2b7a0 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
2b7b0 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
2b7c0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
2b7d0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
2b7e0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
2b7f0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
2b800 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
2b810 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
2b820 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
2b830 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
2b840 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
2b850 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
2b860 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
2b870 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
2b880 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
2b890 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
2b8a0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
2b8b0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
2b8c0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
2b8d0 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
2b8e0 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
2b8f0 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
2b900 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
2b910 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
2b920 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
2b930 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
2b940 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
2b950 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
2b960 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
2b970 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
2b980 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
2b990 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
2b9a0 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
2b9b0 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
2b9c0 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
2b9d0 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
2b9e0 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
2b9f0 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
2ba00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2ba10 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ba20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ba30 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
2ba40 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
2ba50 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
2ba60 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
2ba70 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
2ba80 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
2ba90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
2baa0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2bab0 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
2bac0 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
2bad0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2bae0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
2baf0 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
2bb00 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
2bb10 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
2bb20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
2bb30 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
2bb40 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
2bb50 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
2bb60 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
2bb70 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
2bb80 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
2bb90 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
2bba0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
2bbb0 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
2bbc0 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
2bbd0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
2bbe0 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
2bbf0 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
2bc00 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
2bc10 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
2bc20 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
2bc30 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
2bc40 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
2bc50 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
2bc60 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
2bc70 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
2bc80 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
2bc90 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
2bca0 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
2bcb0 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
2bcc0 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
2bcd0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
2bce0 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
2bcf0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
2bd00 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2bd10 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
2bd20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
2bd30 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2bd40 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
2bd50 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
2bd60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2bd70 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
2bd80 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
2bd90 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
2bda0 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
2bdb0 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
2bdc0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
2bdd0 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
2bde0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
2bdf0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
2be00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
2be10 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
2be20 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
2be30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
2be40 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2be50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
2be60 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
2be70 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
2be80 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
2be90 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
2bea0 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
2beb0 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
2bec0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
2bed0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
2bee0 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
2bef0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
2bf00 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
2bf10 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
2bf20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2bf30 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
2bf40 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
2bf50 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
2bf60 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
2bf70 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2bf80 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2bf90 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2bfa0 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65  ) );..  /* pPage
2bfb0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2bfc0 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69  ily writeable si
2bfd0 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  nce pCell might 
2bfe0 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  be auxiliary.  *
2bff0 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74  * buffer space t
2c000 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20  hat is separate 
2c010 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62  from the pPage b
2c020 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  uffer area */.  
2c030 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50  assert( pCell<pP
2c040 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43  age->aData || pC
2c050 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  ell>=&pPage->aDa
2c060 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
2c070 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
2c080 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2c090 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
2c0a0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f  pDbPage) );..  /
2c0b0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65  * Fill in the he
2c0c0 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64  ader. */.  nHead
2c0d0 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70  er = 0;.  if( !p
2c0e0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2c0f0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a    nHeader += 4;.
2c100 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2c110 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
2c120 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
2c130 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61  rint(&pCell[nHea
2c140 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72  der], nData+nZer
2c150 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
2c160 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d   nData = nZero =
2c170 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   0;.  }.  nHeade
2c180 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
2c190 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
2c1a0 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
2c1b0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2c1c0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2c1d0 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72   &info);.  asser
2c1e0 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d  t( info.nHeader=
2c1f0 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73  =nHeader );.  as
2c200 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d  sert( info.nKey=
2c210 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72  =nKey );.  asser
2c220 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28  t( info.nData==(
2c230 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f  u32)(nData+nZero
2c240 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c  ) );.  .  /* Fil
2c250 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64  l in the payload
2c260 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
2c270 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a   nData + nZero;.
2c280 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2c290 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20  Key ){.    pSrc 
2c2a0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72  = pData;.    nSr
2c2b0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e  c = nData;.    n
2c2c0 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Data = 0;.  }els
2c2d0 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e{ .    if( NEVE
2c2e0 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  R(nKey>0x7ffffff
2c2f0 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20 29 7b  f || pKey==0) ){
2c300 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2c310 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2c320 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  T;.    }.    nPa
2c330 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29 6e 4b  yload += (int)nK
2c340 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
2c350 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
2c360 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
2c370 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
2c380 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65 4c 65  nSize;.  spaceLe
2c390 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ft = info.nLocal
2c3a0 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26  ;.  pPayload = &
2c3b0 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a  pCell[nHeader];.
2c3c0 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c    pPrior = &pCel
2c3d0 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
2c3e0 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e 50 61  ];..  while( nPa
2c3f0 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20 20 69  yload>0 ){.    i
2c400 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20  f( spaceLeft==0 
2c410 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
2c420 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2c430 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
2c440 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
2c450 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
2c460 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
2c470 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
2c480 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
2c490 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2c4a0 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
2c4b0 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
2c4c0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
2c4d0 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
2c4e0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
2c4f0 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
2c500 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
2c510 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
2c520 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
2c530 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
2c540 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2c550 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
2c560 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
2c570 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
2c580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2c590 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
2c5a0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
2c5b0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
2c5c0 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
2c5d0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
2c5e0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
2c5f0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
2c600 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
2c610 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
2c620 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2c630 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
2c640 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
2c650 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
2c660 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2c670 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
2c680 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
2c690 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
2c6a0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
2c6b0 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
2c6c0 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
2c6d0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
2c6e0 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
2c6f0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
2c700 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
2c710 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
2c720 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
2c730 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
2c740 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
2c750 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65  nitialised value
2c760 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
2c770 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
2c780 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
2c790 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
2c7a0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
2c7b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
2c7c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c7d0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
2c7e0 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
2c7f0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
2c800 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
2c810 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2c820 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
2c830 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
2c840 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
2c850 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2c860 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2c870 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
2c880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
2c890 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
2c8a0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
2c8b0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
2c8c0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
2c8d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2c8e0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
2c8f0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
2c900 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
2c910 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
2c920 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
2c930 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
2c940 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
2c950 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
2c960 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
2c970 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2c980 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
2c990 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2c9a0 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
2c9b0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
2c9c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
2c9d0 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
2c9e0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
2c9f0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
2ca00 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
2ca10 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
2ca20 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
2ca30 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
2ca40 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
2ca50 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
2ca60 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
2ca70 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
2ca80 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2ca90 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2caa0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2cab0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
2cac0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
2cad0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2cae0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2caf0 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
2cb00 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
2cb10 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
2cb20 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
2cb30 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
2cb40 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
2cb50 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
2cb60 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
2cb70 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
2cb80 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
2cb90 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c   }.    n = nPayl
2cba0 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
2cbb0 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
2cbc0 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
2cbd0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
2cbe0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
2cbf0 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
2cc00 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
2cc10 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
2cc20 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
2cc30 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
2cc40 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2cc50 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
2cc60 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
2cc70 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
2cc80 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
2cc90 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
2cca0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
2ccb0 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
2ccc0 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
2ccd0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
2cce0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
2ccf0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2cd00 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
2cd10 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
2cd20 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
2cd30 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
2cd40 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
2cd50 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
2cd60 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
2cd70 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2cd80 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2cd90 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
2cda0 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >0 ){.      if( 
2cdb0 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72  n>nSrc ) n = nSr
2cdc0 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
2cdd0 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d   pSrc );.      m
2cde0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
2cdf0 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  pSrc, n);.    }e
2ce00 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
2ce10 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e  t(pPayload, 0, n
2ce20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61  );.    }.    nPa
2ce30 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20  yload -= n;.    
2ce40 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
2ce50 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
2ce60 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
2ce70 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
2ce80 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30  .    if( nSrc==0
2ce90 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d   ){.      nSrc =
2cea0 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53   nData;.      pS
2ceb0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
2cec0 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  }.  }.  releaseP
2ced0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
2cee0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2cef0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
2cf00 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63 65  move the i-th ce
2cf10 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20 20  ll from pPage.  
2cf20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66 66  This routine eff
2cf30 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79 2e  ects pPage only.
2cf40 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f 6e  .** The cell con
2cf50 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65 65  tent is not free
2cf60 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65 64  d or deallocated
2cf70 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  .  It is assumed
2cf80 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65 6c   that.** the cel
2cf90 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
2cfa0 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70 6c  en copied somepl
2cfb0 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73 20  ace else.  This 
2cfc0 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a 20  routine just.** 
2cfd0 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66 65  removes the refe
2cfe0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65 6c  rence to the cel
2cff0 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a  l from pPage..**
2d000 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62 65  .** "sz" must be
2d010 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
2d020 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  ytes in the cell
2d030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d040 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61 67   dropCell(MemPag
2d050 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 64  e *pPage, int id
2d060 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 2a  x, int sz, int *
2d070 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b 20  pRC){.  u32 pc; 
2d080 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2d090 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  t to cell conten
2d0a0 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20  t of cell being 
2d0b0 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20  deleted */.  u8 
2d0c0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
2d0d0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
2d0e0 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
2d0f0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76    /* Used to mov
2d100 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77  e bytes around w
2d110 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  ithin data[] */.
2d120 20 20 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20    u8 *endPtr;   
2d130 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 6f 6f 70    /* End of loop
2d140 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2d150 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
2d160 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
2d170 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
2d180 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
2d190 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
2d1a0 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
2d1b0 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
2d1c0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
2d1d0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
2d1e0 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
2d1f0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
2d200 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
2d210 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
2d220 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2d230 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d240 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2d250 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2d260 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2d270 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2d280 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
2d290 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
2d2a0 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
2d2b0 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70  lIdx[2*idx];.  p
2d2c0 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
2d2d0 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
2d2e0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
2d2f0 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
2d300 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2d310 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
2d320 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
2d330 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2d340 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28   );.  if( pc < (
2d350 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61  u32)get2byte(&da
2d360 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63  ta[hdr+5]) || pc
2d370 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
2d380 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
2d390 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
2d3a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2d3b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2d3c0 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
2d3d0 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
2d3e0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2d3f0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2d400 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 65 6e  return;.  }.  en
2d410 64 50 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61  dPtr = &pPage->a
2d420 43 65 6c 6c 49 64 78 5b 32 2a 70 50 61 67 65 2d  CellIdx[2*pPage-
2d430 3e 6e 43 65 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61  >nCell - 2];.  a
2d440 73 73 65 72 74 28 20 28 53 51 4c 49 54 45 5f 50  ssert( (SQLITE_P
2d450 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29 26 31  TR_TO_INT(ptr)&1
2d460 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74 72 20  )==0 );  /* ptr 
2d470 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79 74 65  is always 2-byte
2d480 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20 77 68   aligned */.  wh
2d490 69 6c 65 28 20 70 74 72 3c 65 6e 64 50 74 72 20  ile( ptr<endPtr 
2d4a0 29 7b 0a 20 20 20 20 2a 28 75 31 36 2a 29 70 74  ){.    *(u16*)pt
2d4b0 72 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b  r = *(u16*)&ptr[
2d4c0 32 5d 3b 0a 20 20 20 20 70 74 72 20 2b 3d 20 32  2];.    ptr += 2
2d4d0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
2d4e0 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79  Cell--;.  put2by
2d4f0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c  te(&data[hdr+3],
2d500 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2d510 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
2d520 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 2;.}../*.** In
2d530 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
2d540 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
2d550 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
2d560 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
2d570 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
2d580 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
2d590 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
2d5a0 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
2d5b0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
2d5c0 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
2d5d0 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
2d5e0 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
2d5f0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
2d600 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
2d610 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
2d620 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
2d630 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
2d640 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
2d650 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
2d660 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e  age->apOvfl[] an
2d670 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
2d680 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
2d690 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
2d6a0 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
2d6b0 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
2d6c0 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
2d6d0 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
2d6e0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
2d6f0 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
2d700 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
2d710 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
2d720 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
2d730 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  emented..**.** I
2d740 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  f nSkip is non-z
2d750 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74  ero, then do not
2d760 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74 20   copy the first 
2d770 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74  nSkip bytes of t
2d780 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20  he.** cell. The 
2d790 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65 72  caller will over
2d7a0 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65 72  write them after
2d7b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
2d7c0 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53  eturns. If.** nS
2d7d0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2d7e0 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79 20   then pCell may 
2d7f0 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20  not point to an 
2d800 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20 6c  invalid memory l
2d810 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75 74  ocation .** (but
2d820 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73 20   pCell+nSkip is 
2d830 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a 2a  always valid)..*
2d840 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
2d850 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
2d860 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
2d870 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
2d880 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
2d890 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
2d8a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
2d8b0 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
2d8c0 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
2d8d0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
2d8e0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
2d8f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
2d900 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
2d910 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
2d920 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
2d930 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
2d940 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
2d950 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
2d960 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
2d970 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
2d980 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
2d990 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
2d9a0 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
2d9b0 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
2d9c0 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  his value */.  i
2d9d0 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20  nt *pRC         
2d9e0 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69   /* Read and wri
2d9f0 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66  te return code f
2da00 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  rom here */.){. 
2da10 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20   int idx = 0;   
2da20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
2da30 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
2da40 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
2da50 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
2da60 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2da70 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2da80 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  end;          /*
2da90 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74   First byte past
2daa0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70   the last cell p
2dab0 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d  ointer in data[]
2dac0 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20   */.  int ins;  
2dad0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2dae0 20 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65   in data[] where
2daf0 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
2db00 72 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f  r is inserted */
2db10 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
2db20 74 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20  t;   /* Address 
2db30 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  of first cell po
2db40 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
2db50 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
2db60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
2db70 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f  ntent of the who
2db80 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  le page */.  u8 
2db90 2a 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f  *ptr;          /
2dba0 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e  * Used for movin
2dbb0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  g information ar
2dbc0 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a  ound in data[] *
2dbd0 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74 72 3b 20  /.  u8 *endPtr; 
2dbe0 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
2dbf0 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 69  the loop */..  i
2dc00 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69  nt nSkip = (iChi
2dc10 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20  ld ? 4 : 0);..  
2dc20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
2dc30 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e  n;..  assert( i>
2dc40 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e  =0 && i<=pPage->
2dc50 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76  nCell+pPage->nOv
2dc60 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65  erflow );.  asse
2dc70 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2dc80 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
2dc90 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
2dca0 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30  (pPage->pBt)<=10
2dcb0 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  921 );.  assert(
2dcc0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2dcd0 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
2dce0 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20  ge->apOvfl) );. 
2dcf0 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
2dd00 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
2dd10 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  )==ArraySize(pPa
2dd20 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20  ge->aiOvfl) );. 
2dd30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2dd40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2dd50 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2dd60 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
2dd70 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
2dd80 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
2dd90 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
2dda0 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
2ddb0 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
2ddc0 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
2ddd0 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
2dde0 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
2ddf0 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
2de00 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
2de10 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
2de20 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
2de30 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
2de40 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
2de50 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
2de60 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
2de70 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
2de80 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
2de90 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
2dea0 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
2deb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
2dec0 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
2ded0 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
2dee0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2def0 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
2df00 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
2df10 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2df20 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
2df30 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
2df40 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
2df50 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
2df60 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
2df70 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
2df80 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
2df90 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
2dfa0 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20   iChild ){.     
2dfb0 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
2dfc0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
2dfd0 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
2dfe0 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
2dff0 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28  assert( j<(int)(
2e000 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70  sizeof(pPage->ap
2e010 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61  Ovfl)/sizeof(pPa
2e020 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20  ge->apOvfl[0])) 
2e030 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70  );.    pPage->ap
2e040 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b  Ovfl[j] = pCell;
2e050 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76  .    pPage->aiOv
2e060 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a  fl[j] = (u16)i;.
2e070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
2e080 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e090 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2e0a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2e0b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e0c0 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72  {.      *pRC = r
2e0d0 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  c;.      return;
2e0e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2e0f0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2e100 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2e110 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2e120 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2e130 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f  aData;.    cellO
2e140 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
2e150 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
2e160 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
2e170 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
2e180 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c  ;.    ins = cell
2e190 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20  Offset + 2*i;.  
2e1a0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53    rc = allocateS
2e1b0 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20  pace(pPage, sz, 
2e1c0 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72  &idx);.    if( r
2e1d0 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20  c ){ *pRC = rc; 
2e1e0 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a  return; }.    /*
2e1f0 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61   The allocateSpa
2e200 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61  ce() routine gua
2e210 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c  rantees the foll
2e220 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72  owing two proper
2e230 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
2e240 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
2e250 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  s */.    assert(
2e260 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b   idx >= end+2 );
2e270 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
2e280 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
2e290 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2e2a0 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
2e2b0 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
2e2c0 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75  age->nFree -= (u
2e2d0 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20  16)(2 + sz);.   
2e2e0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64   memcpy(&data[id
2e2f0 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b  x+nSkip], pCell+
2e300 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29  nSkip, sz-nSkip)
2e310 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  ;.    if( iChild
2e320 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
2e330 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69  te(&data[idx], i
2e340 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
2e350 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 65 6e    ptr = &data[en
2e360 64 5d 3b 0a 20 20 20 20 65 6e 64 50 74 72 20 3d  d];.    endPtr =
2e370 20 26 64 61 74 61 5b 69 6e 73 5d 3b 0a 20 20 20   &data[ins];.   
2e380 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54 45   assert( (SQLITE
2e390 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72 29  _PTR_TO_INT(ptr)
2e3a0 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70 74  &1)==0 );  /* pt
2e3b0 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62 79  r is always 2-by
2e3c0 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20 20  te aligned */.  
2e3d0 20 20 77 68 69 6c 65 28 20 70 74 72 3e 65 6e 64    while( ptr>end
2e3e0 50 74 72 20 29 7b 0a 20 20 20 20 20 20 2a 28 75  Ptr ){.      *(u
2e3f0 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a  16*)ptr = *(u16*
2e400 29 26 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20  )&ptr[-2];.     
2e410 20 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 7d   ptr -= 2;.    }
2e420 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2e430 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
2e440 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
2e450 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2e460 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
2e470 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
2e480 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2e490 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
2e4a0 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
2e4b0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
2e4c0 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
2e4d0 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
2e4e0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2e4f0 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
2e500 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
2e510 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2e520 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
2e530 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
2e540 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e550 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2e560 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
2e570 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  RC);.    }.#endi
2e580 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  f.  }.}../*.** A
2e590 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c  dd a list of cel
2e5a0 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54  ls to a page.  T
2e5b0 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62  he page should b
2e5c0 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74  e initially empt
2e5d0 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20  y..** The cells 
2e5e0 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74  are guaranteed t
2e5f0 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  o fit on the pag
2e600 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
2e610 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a  d assemblePage(.
2e620 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2e630 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ,   /* The page 
2e640 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64  to be assemblied
2e650 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
2e660 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
2e670 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
2e680 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61  o add to this pa
2e690 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2e6a0 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  ell,      /* Poi
2e6b0 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f  nters to cell bo
2e6c0 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61  dies */.  u16 *a
2e6d0 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53  Size        /* S
2e6e0 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  izes of the cell
2e6f0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
2e700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2e710 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
2e720 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20   u8 *pCellptr;  
2e730 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2e740 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
2e750 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
2e760 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
2e770 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
2e780 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
2e790 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50   const data = pP
2e7a0 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  age->aData;     
2e7b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
2e7c0 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70  er to data for p
2e7d0 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2e7e0 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d  int hdr = pPage-
2e7f0 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
2e800 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
2e810 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61  of header on pPa
2e820 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e  ge */.  const in
2e830 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67  t nUsable = pPag
2e840 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
2e850 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69  ze; /* Usable si
2e860 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20  ze of page */.. 
2e870 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2e880 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2e890 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2e8a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2e8b0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2e8c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  );.  assert( nCe
2e8d0 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d  ll>=0 && nCell<=
2e8e0 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
2e8f0 67 65 2d 3e 70 42 74 29 0a 20 20 20 20 20 20 20  ge->pBt).       
2e900 20 20 20 20 20 26 26 20 28 69 6e 74 29 4d 58 5f       && (int)MX_
2e910 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2e920 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73 65  <=10921);.  asse
2e930 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2e940 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2e950 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2e960 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
2e970 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75 73  the page has jus
2e980 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79  t been zeroed by
2e990 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20   zeroPage() */. 
2e9a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2e9b0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73  nCell==0 );.  as
2e9c0 73 65 72 74 28 20 67 65 74 32 62 79 74 65 4e 6f  sert( get2byteNo
2e9d0 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
2e9e0 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b 0a  5])==nUsable );.
2e9f0 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70  .  pCellptr = &p
2ea00 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e  Page->aCellIdx[n
2ea10 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
2ea20 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
2ea30 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
2ea40 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2ea50 75 31 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b 69  u16 sz = aSize[i
2ea60 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  ];.    pCellptr 
2ea70 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62 6f  -= 2;.    cellbo
2ea80 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70 75  dy -= sz;.    pu
2ea90 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c  t2byte(pCellptr,
2eaa0 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20   cellbody);.    
2eab0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
2eac0 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
2ead0 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70 75  ], sz);.  }.  pu
2eae0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2eaf0 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70  +3], nCell);.  p
2eb00 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2eb10 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  r+5], cellbody);
2eb20 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
2eb30 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55  -= (nCell*2 + nU
2eb40 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79  sable - cellbody
2eb50 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
2eb60 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a  l = (u16)nCell;.
2eb70 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
2eb80 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
2eb90 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
2eba0 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
2ebb0 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
2ebc0 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
2ebd0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2ebe0 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2ebf0 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2ec00 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
2ec10 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
2ec20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2ec30 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
2ec40 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
2ec50 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
2ec60 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
2ec70 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
2ec80 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
2ec90 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
2eca0 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
2ecb0 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
2ecc0 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
2ecd0 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
2ece0 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
2ecf0 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
2ed00 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
2ed10 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
2ed20 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
2ed30 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
2ed40 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
2ed50 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
2ed60 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
2ed70 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
2ed80 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
2ed90 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
2eda0 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
2edb0 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
2edc0 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
2edd0 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
2ede0 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
2edf0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
2ee00 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2ee10 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
2ee20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
2ee30 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
2ee40 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
2ee50 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
2ee60 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ce */...#ifndef 
2ee70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2ee80 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
2ee90 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
2eea0 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
2eeb0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
2eec0 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
2eed0 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
2eee0 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
2eef0 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
2ef00 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
2ef10 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
2ef20 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
2ef30 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
2ef40 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
2ef50 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
2ef60 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
2ef70 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
2ef80 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68 65  g to balance the
2ef90 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
2efa0 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
2efb0 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
2efc0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
2efd0 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
2efe0 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
2eff0 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
2f000 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
2f010 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
2f020 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
2f030 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
2f040 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
2f050 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
2f060 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
2f070 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
2f080 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
2f090 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
2f0a0 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
2f0b0 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
2f0c0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
2f0d0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
2f0e0 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
2f0f0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
2f100 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
2f110 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
2f120 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
2f130 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
2f140 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
2f150 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
2f160 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
2f170 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2f180 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
2f190 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63  .**.** The pSpac
2f1a0 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  e buffer is used
2f1b0 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70   to store a temp
2f1c0 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68  orary copy of th
2f1d0 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c  e divider.** cel
2f1e0 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  l that will be i
2f1f0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61  nserted into pPa
2f200 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c  rent. Such a cel
2f210 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
2f220 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e  4.** byte page n
2f230 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  umber followed b
2f240 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  y a variable len
2f250 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20  gth integer. In 
2f260 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
2f270 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73  at most 13 bytes
2f280 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61  . Hence the pSpa
2f290 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  ce buffer must b
2f2a0 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33  e at.** least 13
2f2b0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
2f2c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2f2d0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
2f2e0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65  age *pParent, Me
2f2f0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
2f300 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53   *pSpace){.  BtS
2f310 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74  hared *const pBt
2f320 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20   = pPage->pBt;  
2f330 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61    /* B-Tree Data
2f340 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  base */.  MemPag
2f350 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
2f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f370 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
2f380 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2f390 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3b0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2f3c0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
2f3d0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2f3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2f3f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77  e number of pNew
2f400 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2f410 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2f420 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2f430 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2f440 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2f450 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2f460 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2f470 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2f480 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2f490 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72  .  /* This error
2f4a0 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e 6f   condition is no
2f4b0 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
2f4c0 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
2f4d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 66  function */.  if
2f4e0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
2f4f0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2f500 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2f510 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
2f520 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73 20   new page. This 
2f530 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
2f540 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c 69   the right-sibli
2f550 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61 67  ng of .  ** pPag
2f560 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72 65  e. Make the pare
2f570 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c 65  nt page writable
2f580 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65  , so that the ne
2f590 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20  w divider cell. 
2f5a0 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65 72   ** may be inser
2f5b0 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68 65  ted. If both the
2f5c0 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  se operations ar
2f5d0 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 72  e successful, pr
2f5e0 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72 63  oceed..  */.  rc
2f5f0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2f600 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
2f610 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29   &pgnoNew, 0, 0)
2f620 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2f630 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20 75  ITE_OK ){..    u
2f640 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61 63  8 *pOut = &pSpac
2f650 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43  e[4];.    u8 *pC
2f660 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 70 4f  ell = pPage->apO
2f670 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75 31 36 20  vfl[0];.    u16 
2f680 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a  szCell = cellSiz
2f690 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
2f6a0 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f  l);.    u8 *pSto
2f6b0 70 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  p;..    assert( 
2f6c0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2f6d0 69 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44  iteable(pNew->pD
2f6e0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73  bPage) );.    as
2f6f0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
2f700 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b  ta[0]==(PTF_INTK
2f710 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  EY|PTF_LEAFDATA|
2f720 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20  PTF_LEAF) );.   
2f730 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
2f740 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
2f750 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46  EAFDATA|PTF_LEAF
2f760 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
2f770 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
2f780 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a  ell, &szCell);..
2f790 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
2f7a0 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
2f7b0 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
2f7c0 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
2f7d0 70 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e  p.    ** with en
2f7e0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
2f7f0 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
2f800 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
2f810 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e   .    ** cell on
2f820 20 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20   the page to an 
2f830 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
2f840 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73  f either of thes
2f850 65 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69  e.    ** operati
2f860 6f 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72  ons fails, the r
2f870 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65  eturn code is se
2f880 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65  t, but the conte
2f890 6e 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  nts.    ** of th
2f8a0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72  e parent page ar
2f8b0 65 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61  e still manipula
2f8c0 74 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20  ted by thh code 
2f8d0 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68  below..    ** Th
2f8e0 61 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69  at is Ok, at thi
2f8f0 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65  s point the pare
2f900 6e 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61  nt page is guara
2f910 6e 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  nteed to.    ** 
2f920 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
2f930 74 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  ty. Returning an
2f940 20 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c   error code will
2f950 20 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20   cause a.    ** 
2f960 72 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e  rollback, undoin
2f970 67 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61  g any changes ma
2f980 64 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  de to the parent
2f990 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2f9a0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2f9b0 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  UM ){.      ptrm
2f9c0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e  apPut(pBt, pgnoN
2f9d0 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ew, PTRMAP_BTREE
2f9e0 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c  , pParent->pgno,
2f9f0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28   &rc);.      if(
2fa00 20 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69   szCell>pNew->mi
2fa10 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
2fa20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
2fa30 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20  tr(pNew, pCell, 
2fa40 26 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &rc);.      }.  
2fa50 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72    }.  .    /* Cr
2fa60 65 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63  eate a divider c
2fa70 65 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ell to insert in
2fa80 74 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20  to pParent. The 
2fa90 64 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20  divider cell.   
2faa0 20 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   ** consists of 
2fab0 61 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75  a 4-byte page nu
2fac0 6d 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e  mber (the page n
2fad0 75 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20  umber of pPage) 
2fae0 61 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72  and.    ** a var
2faf0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79  iable length key
2fb00 20 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75   value (which mu
2fb10 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76  st be the same v
2fb20 61 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20  alue as the.    
2fb30 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f  ** largest key o
2fb40 6e 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a  n pPage)..    **
2fb50 0a 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20  .    ** To find 
2fb60 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
2fb70 76 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20  value on pPage, 
2fb80 66 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72  first find the r
2fb90 69 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a  ight-most .    *
2fba0 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e  * cell on pPage.
2fbb0 20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66   The first two f
2fbc0 69 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65  ields of this ce
2fbd0 6c 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20  ll are the .    
2fbe0 2a 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  ** record-length
2fbf0 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e   (a variable len
2fc00 67 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d  gth integer at m
2fc10 6f 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73  ost 32-bits in s
2fc20 69 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20  ize).    ** and 
2fc30 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61  the key value (a
2fc40 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2fc50 20 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61   integer, may ha
2fc60 76 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20  ve any value).. 
2fc70 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
2fc80 6f 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e  of the while(...
2fc90 29 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b  ) loops below sk
2fca0 69 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63  ips over the rec
2fcb0 6f 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ord-length.    *
2fcc0 2a 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63  * field. The sec
2fcd0 6f 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  ond while(...) l
2fce0 6f 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b  oop copies the k
2fcf0 65 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  ey value from th
2fd00 65 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e  e.    ** cell on
2fd10 20 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20   pPage into the 
2fd20 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20  pSpace buffer.. 
2fd30 20 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20     */.    pCell 
2fd40 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2fd50 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  , pPage->nCell-1
2fd60 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2fd70 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2fd80 69 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29  ile( (*(pCell++)
2fd90 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c  &0x80) && pCell<
2fda0 70 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74  pStop );.    pSt
2fdb0 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
2fdc0 20 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70      while( ((*(p
2fdd0 4f 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c  Out++) = *(pCell
2fde0 2b 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43  ++))&0x80) && pC
2fdf0 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20  ell<pStop );..  
2fe00 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
2fe10 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
2fe20 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a   into pParent. *
2fe30 2f 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c  /.    insertCell
2fe40 28 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e  (pParent, pParen
2fe50 74 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65  t->nCell, pSpace
2fe60 2c 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70  , (int)(pOut-pSp
2fe70 61 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ace),.          
2fe80 20 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70       0, pPage->p
2fe90 67 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  gno, &rc);..    
2fea0 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74  /* Set the right
2feb0 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f  -child pointer o
2fec0 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69  f pParent to poi
2fed0 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  nt to the new pa
2fee0 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62  ge. */.    put4b
2fef0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2ff00 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2ff10 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e  Offset+8], pgnoN
2ff20 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52  ew);.  .    /* R
2ff30 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72  elease the refer
2ff40 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20  ence to the new 
2ff50 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c  page. */.    rel
2ff60 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a  easePage(pNew);.
2ff70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2ff80 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
2ff90 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
2ffa0 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30  ALANCE */..#if 0
2ffb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2ffc0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f  tion does not co
2ffd0 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e  ntribute anythin
2ffe0 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  g to the operati
2fff0 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a  on of SQLite..**
30000 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73   it is sometimes
30010 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f   activated tempo
30020 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62  rarily while deb
30030 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70  ugging code resp
30040 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20  onsible .** for 
30050 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d  setting pointer-
30060 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  map entries..*/.
30070 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
30080 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50  pCheckPages(MemP
30090 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e  age **apPage, in
300a0 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  t nPage){.  int 
300b0 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  i, j;.  for(i=0;
300c0 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a   i<nPage; i++){.
300d0 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20      Pgno n;.    
300e0 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  u8 e;.    MemPag
300f0 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67  e *pPage = apPag
30100 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72  e[i];.    BtShar
30110 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
30120 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
30130 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
30140 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  );..    for(j=0;
30150 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   j<pPage->nCell;
30160 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c   j++){.      Cel
30170 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
30180 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20    u8 *z;.     . 
30190 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c       z = findCel
301a0 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20  l(pPage, j);.   
301b0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
301c0 6c 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26  lPtr(pPage, z, &
301d0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  info);.      if(
301e0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
301f0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
30200 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
30210 26 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  &z[info.iOverflo
30220 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  w]);.        ptr
30230 6d 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c  mapGet(pBt, ovfl
30240 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20  , &e, &n);.     
30250 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
30260 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
30270 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
30280 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
30290 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
302a0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  af ){.        Pg
302b0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
302c0 79 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  yte(z);.        
302d0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
302e0 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
302f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
30300 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26  ==pPage->pgno &&
30310 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45   e==PTRMAP_BTREE
30320 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
30330 7d 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  }.    if( !pPage
30340 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
30350 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74  Pgno child = get
30360 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
30370 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
30380 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20  fset+8]);.      
30390 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63  ptrmapGet(pBt, c
303a0 68 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20  hild, &e, &n);. 
303b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
303c0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
303d0 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
303e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
303f0 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66  turn 1;.}.#endif
30400 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
30410 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
30420 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   copy the conten
30430 74 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ts of the b-tree
30440 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a   node stored .**
30450 20 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74   on page pFrom t
30460 6f 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  o page pTo. If p
30470 61 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f  age pFrom was no
30480 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74  t a leaf page, t
30490 68 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  hen.** the point
304a0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
304b0 6f 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61  or each child pa
304c0 67 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73  ge are updated s
304d0 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  o that the.** pa
304e0 72 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64  rent page stored
304f0 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20   in the pointer 
30500 6d 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e  map is page pTo.
30510 20 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69   If pFrom contai
30520 6e 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73  ned.** any cells
30530 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70   with overflow p
30540 61 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68  age pointers, th
30550 65 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  en the correspon
30560 64 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ding pointer.** 
30570 6d 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20  map entries are 
30580 61 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20  also updated so 
30590 74 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20  that the parent 
305a0 70 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f  page is page pTo
305b0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d  ..**.** If pFrom
305c0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61   is currently ca
305d0 72 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66  rrying any overf
305e0 6c 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69  low cells (entri
305f0 65 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d  es in the.** Mem
30600 50 61 67 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72  Page.apOvfl[] ar
30610 72 61 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e  ray), they are n
30620 6f 74 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f  ot copied to pTo
30630 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20  . .**.** Before 
30640 72 65 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20  returning, page 
30650 70 54 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c  pTo is reinitial
30660 69 7a 65 64 20 75 73 69 6e 67 20 62 74 72 65 65  ized using btree
30670 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  InitPage()..**.*
30680 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  * The performanc
30690 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
306a0 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63  on is not critic
306b0 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75  al. It is only u
306c0 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62  sed by .** the b
306d0 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
306e0 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64  () and balance_d
306f0 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72  eeper() procedur
30700 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a  es, neither of.*
30710 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c  * which are call
30720 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e  ed often under n
30730 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e  ormal circumstan
30740 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ces..*/.static v
30750 6f 69 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  oid copyNodeCont
30760 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72  ent(MemPage *pFr
30770 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  om, MemPage *pTo
30780 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
30790 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
307a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68  E_OK ){.    BtSh
307b0 61 72 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74  ared * const pBt
307c0 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20   = pFrom->pBt;. 
307d0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46     u8 * const aF
307e0 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61  rom = pFrom->aDa
307f0 74 61 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  ta;.    u8 * con
30800 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44  st aTo = pTo->aD
30810 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  ata;.    int con
30820 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46  st iFromHdr = pF
30830 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  rom->hdrOffset;.
30840 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54      int const iT
30850 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67  oHdr = ((pTo->pg
30860 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30  no==1) ? 100 : 0
30870 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  );.    int rc;. 
30880 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20     int iData;.  
30890 0a 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  .  .    assert( 
308a0 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
308b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
308c0 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64  om->nFree>=iToHd
308d0 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
308e0 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
308f0 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d  [iFromHdr+5]) <=
30900 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
30910 65 53 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20  eSize );.  .    
30920 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
30930 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
30940 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
30950 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
30960 20 20 20 20 69 44 61 74 61 20 3d 20 67 65 74 32      iData = get2
30970 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
30980 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65  mHdr+5]);.    me
30990 6d 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d  mcpy(&aTo[iData]
309a0 2c 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c  , &aFrom[iData],
309b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
309c0 2d 69 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d  -iData);.    mem
309d0 63 70 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d  cpy(&aTo[iToHdr]
309e0 2c 20 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  , &aFrom[iFromHd
309f0 72 5d 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f  r], pFrom->cellO
30a00 66 66 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d  ffset + 2*pFrom-
30a10 3e 6e 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20  >nCell);.  .    
30a20 2f 2a 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20  /* Reinitialize 
30a30 70 61 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74  page pTo so that
30a40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
30a50 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
30a60 75 63 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61  ucture.    ** ma
30a70 74 63 68 20 74 68 65 20 6e 65 77 20 64 61 74 61  tch the new data
30a80 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  . The initializa
30a90 74 69 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20  tion of pTo can 
30aa0 61 63 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e  actually fail un
30ab0 64 65 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c  der.    ** fairl
30ac0 79 20 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d  y obscure circum
30ad0 73 74 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68  stances, even th
30ae0 6f 75 67 68 20 69 74 20 69 73 20 61 20 63 6f 70  ough it is a cop
30af0 79 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  y of initialized
30b00 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46   .    ** page pF
30b10 72 6f 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rom..    */.    
30b20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  pTo->isInit = 0;
30b30 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
30b40 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20  nitPage(pTo);.  
30b50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30b60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
30b70 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
30b80 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  turn;.    }.  . 
30b90 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
30ba0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
30bb0 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
30bc0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
30bd0 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
30be0 66 6f 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f  for any b-tree o
30bf0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
30c00 20 74 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f   that pTo now co
30c10 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
30c20 65 72 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20  ers to..    */. 
30c30 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
30c40 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  UUM ){.      *pR
30c50 43 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  C = setChildPtrm
30c60 61 70 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a  aps(pTo);.    }.
30c70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
30c80 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
30c90 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
30ca0 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
30cb0 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
30cc0 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
30cd0 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
30ce0 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
30cf0 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
30d00 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
30d10 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
30d20 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
30d30 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
30d40 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
30d50 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
30d60 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65  .** page are use
30d70 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
30d80 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20  ng, though both 
30d90 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
30da0 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ome from one.** 
30db0 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  side if the page
30dc0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72   is the first or
30dd0 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
30de0 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68  ts parent. If th
30df0 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66  e page .** has f
30e00 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c  ewer than 2 sibl
30e10 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20  ings (something 
30e20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
30e30 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67  appen if the pag
30e40 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70  e.** is a root p
30e50 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f  age or a child o
30e60 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74  f a root page) t
30e70 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
30e80 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61  e siblings.** pa
30e90 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
30ea0 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
30eb0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
30ec0 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20  siblings of the 
30ed0 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  page might be in
30ee0 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
30ef0 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20  ased by .** one 
30f00 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  or two in an eff
30f10 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
30f20 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
30f30 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
30f40 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
30f50 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
30f60 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
30f70 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
30f80 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
30f90 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
30fa0 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
30fb0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e  MemPage.aData[].
30fc0 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
30fd0 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
30fe0 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69  is overfull. Thi
30ff0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
31000 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73  s that all cells
31010 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f   allocated.** to
31020 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
31030 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69  s siblings fit i
31040 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  nto MemPage.aDat
31050 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72  a[] before retur
31060 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ning..**.** In t
31070 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
31080 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20  ancing the page 
31090 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
310a0 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a  , cells may be.*
310b0 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
310c0 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
310d0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
310e0 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67  (pParent). Doing
310f0 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65   so.** may cause
31100 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
31110 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
31120 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
31130 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70  . If this.** hap
31140 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20  pens, it is the 
31150 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
31160 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
31170 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65  invoke the corre
31180 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20  ct.** balancing 
31190 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74  routine to fix t
311a0 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65  his problem (see
311b0 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
311c0 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20  outine). .**.** 
311d0 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
311e0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
311f0 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
31200 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
31210 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
31220 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66  ted state. So if
31230 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
31240 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
31250 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
31260 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
31270 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75  * The third argu
31280 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
31290 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63  ction, aOvflSpac
312a0 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
312b0 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62  to a.** buffer b
312c0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
312d0 64 20 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77  d one page. If w
312e0 68 69 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63  hile inserting c
312f0 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
31300 72 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50  rent.** page (pP
31310 61 72 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e  arent) the paren
31320 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
31330 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75  verfull, this bu
31340 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20  ffer is.** used 
31350 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70 61 72  to store the par
31360 65 6e 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63  ent's overflow c
31370 65 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68  ells. Because th
31380 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65  is function inse
31390 72 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d  rts.** a maximum
313a0 20 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65 72   of four divider
313b0 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20   cells into the 
313c0 70 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64  parent page, and
313d0 20 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20   the maximum.** 
313e0 73 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73  size of a cell s
313f0 74 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20  tored within an 
31400 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73  internal node is
31410 20 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61   always less tha
31420 6e 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20  n 1/4.** of the 
31430 70 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61  page-size, the a
31440 4f 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66  OvflSpace[] buff
31450 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  er is guaranteed
31460 20 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20   to be large.** 
31470 65 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f  enough for all o
31480 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
31490 2a 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61  *.** If aOvflSpa
314a0 63 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e  ce is set to a n
314b0 75 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ull pointer, thi
314c0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
314d0 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  ns .** SQLITE_NO
314e0 4d 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  MEM..*/.static i
314f0 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
31500 6f 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ot(.  MemPage *p
31510 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20  Parent,         
31520 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20        /* Parent 
31530 70 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73  page of siblings
31540 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20   being balanced 
31550 2a 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74  */.  int iParent
31560 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
31570 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
31580 20 22 74 68 65 20 70 61 67 65 22 20 69 6e 20 70   "the page" in p
31590 50 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a  Parent */.  u8 *
315a0 61 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20  aOvflSpace,     
315b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
315c0 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f  age-size bytes o
315d0 66 20 73 70 61 63 65 20 66 6f 72 20 70 61 72 65  f space for pare
315e0 6e 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74  nt ovfl */.  int
315f0 20 69 73 52 6f 6f 74 2c 20 20 20 20 20 20 20 20   isRoot,        
31600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31610 54 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20  True if pParent 
31620 69 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a  is a root-page *
31630 2f 0a 20 20 69 6e 74 20 62 42 75 6c 6b 20 20 20  /.  int bBulk   
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31650 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
31660 68 69 73 20 63 61 6c 6c 20 69 73 20 70 61 72 74  his call is part
31670 20 6f 66 20 61 20 62 75 6c 6b 20 6c 6f 61 64 20   of a bulk load 
31680 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
31690 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
316a0 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
316b0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
316c0 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
316d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
316e0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
316f0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
31700 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
31710 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
31720 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
31730 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
31740 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
31750 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20  nt nNew = 0;    
31760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31770 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
31780 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
31790 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20  nt nOld;        
317a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
317b0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
317c0 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
317d0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
317e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
317f0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
31800 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20    int nxDiv;    
31810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31820 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73  * Next divider s
31830 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  lot in pParent->
31840 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
31850 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
31870 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
31880 20 20 75 31 36 20 6c 65 61 66 43 6f 72 72 65 63    u16 leafCorrec
31890 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
318a0 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20  * 4 if pPage is 
318b0 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f  a leaf.  0 if no
318c0 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44  t */.  int leafD
318d0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
318e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
318f0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f  Page is a leaf o
31900 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65  f a LEAFDATA tre
31910 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
31920 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  eSpace;         
31930 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
31940 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65  pPage beyond the
31950 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
31960 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20   pageFlags;     
31970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
31980 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  ue of pPage->aDa
31990 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ta[0] */.  int s
319a0 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  ubtotal;        
319b0 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f          /* Subto
319c0 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20  tal of bytes in 
319d0 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67  cells on one pag
319e0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  e */.  int iSpac
319f0 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
31a00 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
31a10 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
31a20 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ce1[] */.  int i
31a30 4f 76 66 6c 53 70 61 63 65 20 3d 20 30 3b 20 20  OvflSpace = 0;  
31a40 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
31a50 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
31a60 61 4f 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a  aOvflSpace[] */.
31a70 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b    int szScratch;
31a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31a90 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63  * Size of scratc
31aa0 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74  h memory request
31ab0 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ed */.  MemPage 
31ac0 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  *apOld[NB];     
31ad0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
31ae0 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c  d up to two sibl
31af0 69 6e 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ings */.  MemPag
31b00 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
31b10 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
31b20 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
31b30 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
31b40 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
31b50 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
31b60 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
31b70 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
31b80 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
31b90 75 38 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20  u8 *pRight;     
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31bb0 4c 6f 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65  Location in pare
31bc0 6e 74 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c  nt of right-sibl
31bd0 69 6e 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ing pointer */. 
31be0 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d   u8 *apDiv[NB-1]
31bf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
31c00 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   Divider cells i
31c10 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69  n pParent */.  i
31c20 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b  nt cntNew[NB+2];
31c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31c40 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20  ndex in aCell[] 
31c50 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d  of cell after i-
31c60 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  th page */.  int
31c70 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20   szNew[NB+2];   
31c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
31c90 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65  bined size of ce
31ca0 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74  lls place on i-t
31cb0 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  h page */.  u8 *
31cc0 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  *apCell = 0;    
31cd0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
31ce0 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61  cells begin bala
31cf0 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73  nced */.  u16 *s
31d00 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zCell;          
31d10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20         /* Local 
31d20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c  size of all cell
31d30 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
31d40 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20  .  u8 *aSpace1; 
31d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d60 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70  /* Space for cop
31d70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73 20  ies of dividers 
31d80 63 65 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20  cells */.  Pgno 
31d90 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
31da0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
31db0 76 61 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70  var to store a p
31dc0 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f  age number in */
31dd0 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e  ..  pBt = pParen
31de0 74 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  t->pBt;.  assert
31df0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
31e00 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
31e10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
31e20 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31e30 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
31e40 44 62 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20  DbPage) );..#if 
31e50 30 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  0.  TRACE(("BALA
31e60 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20  NCE: begin page 
31e70 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e  %d child of %d\n
31e80 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
31e90 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b  pParent->pgno));
31ea0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74  .#endif..  /* At
31eb0 20 74 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72   this point pPar
31ec0 65 6e 74 20 6d 61 79 20 68 61 76 65 20 61 74 20  ent may have at 
31ed0 6d 6f 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f  most one overflo
31ee0 77 20 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20  w cell. And if. 
31ef0 20 2a 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   ** this overflo
31f00 77 20 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e  w cell is presen
31f10 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 74 68  t, it must be th
31f20 65 20 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a  e cell with .  *
31f30 2a 20 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49  * index iParentI
31f40 64 78 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69  dx. This scenari
31f50 6f 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68  o comes about wh
31f60 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
31f70 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  .  ** is called 
31f80 28 69 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f  (indirectly) fro
31f90 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65  m sqlite3BtreeDe
31fa0 6c 65 74 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61  lete()..  */.  a
31fb0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
31fc0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
31fd0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
31fe0 6f 77 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ow==1 );.  asser
31ff0 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
32000 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
32010 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d 3d 3d  ent->aiOvfl[0]==
32020 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20  iParentIdx );.. 
32030 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65   if( !aOvflSpace
32040 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
32050 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
32060 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
32070 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
32080 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c   balance. Also l
32090 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ocate the cells 
320a0 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a  in pParent .  **
320b0 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65   that divide the
320c0 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74   siblings. An at
320d0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
320e0 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
320f0 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65  s on .  ** eithe
32100 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  r side of pPage.
32110 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
32120 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
32130 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
32140 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20   .  ** if there 
32150 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
32160 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
32170 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66  e other side. If
32180 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
32190 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
321a0 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
321b0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
321c0 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20  ent are taken.  
321d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
321e0 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20  loop also drops 
321f0 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
32200 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  s from the paren
32210 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a  t page. This.  *
32220 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69  * way, the remai
32230 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63  nder of the func
32240 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61  tion does not ha
32250 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ve to deal with 
32260 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  any.  ** overflo
32270 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  w cells in the p
32280 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63  arent page, sinc
32290 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64  e if any existed
322a0 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20   they will.  ** 
322b0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
322c0 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a  n removed..  */.
322d0 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e    i = pParent->n
322e0 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65  Overflow + pPare
322f0 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  nt->nCell;.  if(
32300 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69   i<2 ){.    nxDi
32310 76 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v = 0;.  }else{.
32320 20 20 20 20 61 73 73 65 72 74 28 20 62 42 75 6c      assert( bBul
32330 6b 3d 3d 30 20 7c 7c 20 62 42 75 6c 6b 3d 3d 31  k==0 || bBulk==1
32340 20 29 3b 0a 20 20 20 20 69 66 28 20 69 50 61 72   );.    if( iPar
32350 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20 20  entIdx==0 ){    
32360 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
32370 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20      nxDiv = 0;. 
32380 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50 61     }else if( iPa
32390 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20  rentIdx==i ){.  
323a0 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32 2b      nxDiv = i-2+
323b0 62 42 75 6c 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  bBulk;.    }else
323c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
323d0 62 42 75 6c 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  bBulk==0 );.    
323e0 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65 6e    nxDiv = iParen
323f0 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  tIdx-1;.    }.  
32400 20 20 69 20 3d 20 32 2d 62 42 75 6c 6b 3b 0a 20    i = 2-bBulk;. 
32410 20 7d 0a 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b   }.  nOld = i+1;
32420 0a 20 20 69 66 28 20 28 69 2b 6e 78 44 69 76 2d  .  if( (i+nxDiv-
32430 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
32440 6f 77 29 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  ow)==pParent->nC
32450 65 6c 6c 20 29 7b 0a 20 20 20 20 70 52 69 67 68  ell ){.    pRigh
32460 74 20 3d 20 26 70 50 61 72 65 6e 74 2d 3e 61 44  t = &pParent->aD
32470 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
32480 4f 66 66 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c  Offset+8];.  }el
32490 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d  se{.    pRight =
324a0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e   findCell(pParen
324b0 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
324c0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a  nt->nOverflow);.
324d0 20 20 7d 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74    }.  pgno = get
324e0 34 62 79 74 65 28 70 52 69 67 68 74 29 3b 0a 20  4byte(pRight);. 
324f0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
32500 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
32510 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
32520 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  &apOld[i]);.    
32530 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
32540 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c  memset(apOld, 0,
32550 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65   (i+1)*sizeof(Me
32560 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
32570 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
32580 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
32590 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
325a0 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
325b0 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
325c0 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
325d0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
325e0 20 20 20 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d     if( i+nxDiv==
325f0 70 50 61 72 65 6e 74 2d 3e 61 69 4f 76 66 6c 5b  pParent->aiOvfl[
32600 30 5d 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  0] && pParent->n
32610 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
32620 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
32630 72 65 6e 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 3b  rent->apOvfl[0];
32640 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
32650 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
32660 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
32670 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
32680 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
32690 29 3b 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74  );.      pParent
326a0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
326b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
326c0 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
326d0 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
326e0 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
326f0 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20  nOverflow);.    
32700 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
32710 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
32720 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
32730 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
32740 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20  t, apDiv[i]);.. 
32750 20 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65       /* Drop the
32760 20 63 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70   cell from the p
32770 61 72 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69  arent page. apDi
32780 76 5b 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74  v[i] still point
32790 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  s to.      ** th
327a0 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68  e cell within th
327b0 65 20 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74  e parent, even t
327c0 68 6f 75 67 68 20 69 74 20 68 61 73 20 62 65 65  hough it has bee
327d0 6e 20 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20  n dropped..     
327e0 20 2a 2a 20 54 68 69 73 20 69 73 20 73 61 66 65   ** This is safe
327f0 20 62 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e   because droppin
32800 67 20 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76  g a cell only ov
32810 65 72 77 72 69 74 65 73 20 74 68 65 20 66 69 72  erwrites the fir
32820 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
32830 20 62 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e   bytes of it, an
32840 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
32850 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68  does not need th
32860 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
32870 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74   four bytes of t
32880 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e  he divider cell.
32890 20 53 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20   So the pointer 
328a0 69 73 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20  is safe to use. 
328b0 20 20 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e       ** later on
328c0 2e 20 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  .  .      **.   
328d0 20 20 20 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66     ** But not if
328e0 20 77 65 20 61 72 65 20 69 6e 20 73 65 63 75 72   we are in secur
328f0 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
32900 6e 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  n secure-delete 
32910 6d 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  mode,.      ** t
32920 68 65 20 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f  he dropCell() ro
32930 75 74 69 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77  utine will overw
32940 72 69 74 65 20 74 68 65 20 65 6e 74 69 72 65 20  rite the entire 
32950 63 65 6c 6c 20 77 69 74 68 20 7a 65 72 6f 65 73  cell with zeroes
32960 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68  ..      ** In th
32970 69 73 20 63 61 73 65 2c 20 74 65 6d 70 6f 72 61  is case, tempora
32980 72 69 6c 79 20 63 6f 70 79 20 74 68 65 20 63 65  rily copy the ce
32990 6c 6c 20 69 6e 74 6f 20 74 68 65 20 61 4f 76 66  ll into the aOvf
329a0 6c 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a  lSpace[].      *
329b0 2a 20 62 75 66 66 65 72 2e 20 49 74 20 77 69 6c  * buffer. It wil
329c0 6c 20 62 65 20 63 6f 70 69 65 64 20 6f 75 74 20  l be copied out 
329d0 61 67 61 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73  again as soon as
329e0 20 74 68 65 20 61 53 70 61 63 65 5b 5d 20 62 75   the aSpace[] bu
329f0 66 66 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73  ffer.      ** is
32a00 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a   allocated.  */.
32a10 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62        if( pBt->b
32a20 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
32a30 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
32a40 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b         int iOff;
32a50 0a 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  ..        iOff =
32a60 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
32a70 4e 54 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53  NT(apDiv[i]) - S
32a80 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
32a90 28 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29  (pParent->aData)
32aa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69  ;.        if( (i
32ab0 4f 66 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69  Off+szNew[i])>(i
32ac0 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
32ad0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
32ae0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
32af0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
32b00 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
32b10 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f  , 0, (i+1)*sizeo
32b20 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20  f(MemPage*));.  
32b30 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
32b40 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
32b50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32b60 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
32b70 4f 76 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c  OvflSpace[iOff],
32b80 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77   apDiv[i], szNew
32b90 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
32ba0 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66  apDiv[i] = &aOvf
32bb0 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d  lSpace[apDiv[i]-
32bc0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b  pParent->aData];
32bd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32be0 20 7d 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c   }.      dropCel
32bf0 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44  l(pParent, i+nxD
32c00 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  iv-pParent->nOve
32c10 72 66 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c  rflow, szNew[i],
32c20 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
32c30 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78  ..  /* Make nMax
32c40 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65  Cells a multiple
32c50 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74   of 4 in order t
32c60 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74  o preserve 8-byt
32c70 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74  e.  ** alignment
32c80 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20   */.  nMaxCells 
32c90 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33  = (nMaxCells + 3
32ca0 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  )&~3;..  /*.  **
32cb0 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
32cc0 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  for memory struc
32cd0 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d  tures.  */.  k =
32ce0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b   pBt->pageSize +
32cf0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d   ROUND8(sizeof(M
32d00 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63  emPage));.  szSc
32d10 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
32d20 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
32d30 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
32d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
32d50 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
32d60 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
32d70 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
32d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
32d90 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70  Cell */.     + p
32da0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20  Bt->pageSize    
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53             /* aS
32dd0 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20  pace1 */.     + 
32de0 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  k*nOld;         
32df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32e10 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f  age copies (apCo
32e20 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  py) */.  apCell 
32e30 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
32e40 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
32e50 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
32e60 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
32e70 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
32e80 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
32e90 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
32ea0 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
32eb0 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
32ec0 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28  ];.  aSpace1 = (
32ed0 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78  u8*)&szCell[nMax
32ee0 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74  Cells];.  assert
32ef0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
32f00 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20  GNMENT(aSpace1) 
32f10 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f  );..  /*.  ** Lo
32f20 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61  ad pointers to a
32f30 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c  ll cells on sibl
32f40 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74 68  ing pages and th
32f50 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
32f60 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f    ** into the lo
32f70 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72  cal apCell[] arr
32f80 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73  ay.  Make copies
32f90 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
32fa0 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
32fb0 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
32fc0 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e  rom aSpace1[] an
32fd0 64 20 72 65 6d 6f 76 65 20 74 68 65 20 64 69 76  d remove the div
32fe0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
32ff0 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20  from pParent..  
33000 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73  **.  ** If the s
33010 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c  iblings are on l
33020 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20  eaf pages, then 
33030 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65  the child pointe
33040 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64  rs of the.  ** d
33050 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65  ivider cells are
33060 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74   stripped from t
33070 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20  he cells before 
33080 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a  they are copied.
33090 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65    ** into aSpace
330a0 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61  1[].  In this wa
330b0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
330c0 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74  apCell[] are wit
330d0 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20  hout.  ** child 
330e0 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69  pointers.  If si
330f0 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
33100 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20  eaves, then all 
33110 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43  cell in.  ** apC
33120 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68  ell[] include ch
33130 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45  ild pointers.  E
33140 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63  ither way, all c
33150 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
33160 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e  .  ** are alike.
33170 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43  .  **.  ** leafC
33180 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66  orrection:  4 if
33190 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
331a0 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69 73  .  0 if pPage is
331b0 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a   not a leaf..  *
331c0 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74 61  *       leafData
331d0 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68 6f  :  1 if pPage ho
331e0 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64  lds key+data and
331f0 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f   pParent holds o
33200 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20  nly keys..  */. 
33210 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20   leafCorrection 
33220 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61 66  = apOld[0]->leaf
33230 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d  *4;.  leafData =
33240 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44 61   apOld[0]->hasDa
33250 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ta;.  for(i=0; i
33260 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
33270 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20 20   int limit;.    
33280 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 64  .    /* Before d
33290 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 6c  oing anything el
332a0 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79 20  se, take a copy 
332b0 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69 67  of the i'th orig
332c0 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20 20  inal sibling.   
332d0 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20   ** The rest of 
332e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
332f0 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d  ll use data from
33300 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68   the copies rath
33310 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  er.    ** that t
33320 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
33330 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
33340 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
33350 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a  be in the.    **
33360 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
33370 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 20  g overwritten.  
33380 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
33390 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d  pOld = apCopy[i]
333a0 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61 53   = (MemPage*)&aS
333b0 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53  pace1[pBt->pageS
333c0 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20 20  ize + k*i];.    
333d0 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70 4f  memcpy(pOld, apO
333e0 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
333f0 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f 6c  mPage));.    pOl
33400 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69 64  d->aData = (void
33410 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20 20  *)&pOld[1];.    
33420 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44 61  memcpy(pOld->aDa
33430 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44  ta, apOld[i]->aD
33440 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69  ata, pBt->pageSi
33450 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74 20  ze);..    limit 
33460 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f  = pOld->nCell+pO
33470 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  ld->nOverflow;. 
33480 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76     if( pOld->nOv
33490 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
334a0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
334b0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
334c0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
334d0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
334e0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
334f0 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  l] = findOverflo
33500 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a  wCell(pOld, j);.
33510 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
33520 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
33530 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
33540 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
33550 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
33560 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
33570 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20      u8 *aData = 
33580 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 20  pOld->aData;.   
33590 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65 20     u16 maskPage 
335a0 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67 65  = pOld->maskPage
335b0 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c 6c  ;.      u16 cell
335c0 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e 63  Offset = pOld->c
335d0 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ellOffset;.     
335e0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69   for(j=0; j<limi
335f0 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; j++){.       
33600 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e   assert( nCell<n
33610 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
33620 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
33630 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28 61  ] = findCellv2(a
33640 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c 20  Data, maskPage, 
33650 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b 0a  cellOffset, j);.
33660 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e          szCell[n
33670 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
33680 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
33690 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
336a0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20    nCell++;.     
336b0 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20 0a   }.    }       .
336c0 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
336d0 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a   && !leafData){.
336e0 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28        u16 sz = (
336f0 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20  u16)szNew[i];.  
33700 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
33710 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
33720 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a  ll<nMaxCells );.
33730 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
33740 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
33750 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31  pTemp = &aSpace1
33760 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20  [iSpace1];.     
33770 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
33780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
33790 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  <=pBt->maxLocal+
337a0 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  23 );.      asse
337b0 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20 28  rt( iSpace1 <= (
337c0 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  int)pBt->pageSiz
337d0 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e );.      memcp
337e0 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69  y(pTemp, apDiv[i
337f0 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61 70  ], sz);.      ap
33800 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
33810 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
33820 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  on;.      assert
33830 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
33840 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72 65  ==0 || leafCorre
33850 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
33860 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
33870 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20  = szCell[nCell] 
33880 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  - leafCorrection
33890 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c  ;.      if( !pOl
338a0 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
338b0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
338c0 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a  orrection==0 );.
338d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
338e0 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 3d  pOld->hdrOffset=
338f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 );.        /*
33900 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
33910 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
33920 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
33930 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
33940 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
33950 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
33960 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  l */.        mem
33970 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  cpy(apCell[nCell
33980 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b  ], &pOld->aData[
33990 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65  8], 4);.      }e
339a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
339b0 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
339c0 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20  ion==4 );.      
339d0 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65    if( szCell[nCe
339e0 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ll]<4 ){.       
339f0 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c     /* Do not all
33a00 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61  ow any cells sma
33a10 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74 65  ller than 4 byte
33a20 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
33a30 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
33a40 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  4;.        }.   
33a50 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c     }.      nCell
33a60 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
33a70 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20   /*.  ** Figure 
33a80 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  out the number o
33a90 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20 74  f pages needed t
33aa0 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c  o hold all nCell
33ab0 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f   cells..  ** Sto
33ac0 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69  re this number i
33ad0 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d  n "k".  Also com
33ae0 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69  pute szNew[] whi
33af0 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a  ch is the total.
33b00 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c    ** size of all
33b10 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d   cells on the i-
33b20 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e  th page and cntN
33b30 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68  ew[] which is th
33b40 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20  e index.  ** in 
33b50 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20  apCell[] of the 
33b60 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65  cell that divide
33b70 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61  s page i from pa
33b80 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63  ge i+1.  .  ** c
33b90 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20  ntNew[k] should 
33ba0 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a  equal nCell..  *
33bb0 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f  *.  ** Values co
33bc0 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20 62  mputed by this b
33bd0 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lock:.  **.  ** 
33be0 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65            k: The
33bf0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
33c00 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20   sibling pages. 
33c10 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a   **    szNew[i]:
33c20 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20   Spaced used on 
33c30 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67  the i-th sibling
33c40 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e   page..  **   cn
33c50 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69  tNew[i]: Index i
33c60 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73  n apCell[] and s
33c70 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20  zCell[] for the 
33c80 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20  first cell to.  
33c90 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
33ca0 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68 65  the right of the
33cb0 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61   i-th sibling pa
33cc0 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53  ge..  ** usableS
33cd0 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20  pace: Number of 
33ce0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
33cf0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68  vailable on each
33d00 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a   sibling..  ** .
33d10 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61    */.  usableSpa
33d20 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ce = pBt->usable
33d30 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66  Size - 12 + leaf
33d40 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f  Correction;.  fo
33d50 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30  r(subtotal=k=i=0
33d60 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
33d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e  .    assert( i<n
33d80 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
33d90 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65  subtotal += szCe
33da0 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69  ll[i] + 2;.    i
33db0 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73  f( subtotal > us
33dc0 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20  ableSpace ){.   
33dd0 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75     szNew[k] = su
33de0 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b  btotal - szCell[
33df0 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77  i];.      cntNew
33e00 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69  [k] = i;.      i
33e10 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69  f( leafData ){ i
33e20 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74  --; }.      subt
33e30 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  otal = 0;.      
33e40 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  k++;.      if( k
33e50 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53 51  >NB+1 ){ rc = SQ
33e60 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33e70 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f  T; goto balance_
33e80 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20 7d  cleanup; }.    }
33e90 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20  .  }.  szNew[k] 
33ea0 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e  = subtotal;.  cn
33eb0 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b  tNew[k] = nCell;
33ec0 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20  .  k++;..  /*.  
33ed0 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63  ** The packing c
33ee0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70  omputed by the p
33ef0 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73  revious block is
33f00 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74   biased toward t
33f10 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a  he siblings.  **
33f20 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64   on the left sid
33f30 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62  e.  The left sib
33f40 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73  lings are always
33f50 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68   nearly full, wh
33f60 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67  ile the.  ** rig
33f70 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20  ht-most sibling 
33f80 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20  might be nearly 
33f90 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f  empty.  This blo
33fa0 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d  ck of code attem
33fb0 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75  pts.  ** to adju
33fc0 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f  st the packing o
33fd0 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65  f siblings to ge
33fe0 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e  t a better balan
33ff0 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ce..  **.  ** Th
34000 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
34010 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70   more than an op
34020 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65  timization.  The
34030 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d   packing above m
34040 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20  ight.  ** be so 
34050 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61  out of balance a
34060 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e  s to be illegal.
34070 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74    For example, t
34080 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20  he right-most.  
34090 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  ** sibling might
340a0 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   be completely e
340b0 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75  mpty.  This adju
340c0 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70  stment is not op
340d0 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66  tional..  */.  f
340e0 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69  or(i=k-1; i>0; i
340f0 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52  --){.    int szR
34100 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b  ight = szNew[i];
34110 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62    /* Size of sib
34120 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68  ling on the righ
34130 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c  t */.    int szL
34140 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d  eft = szNew[i-1]
34150 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62  ; /* Size of sib
34160 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74  ling on the left
34170 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20   */.    int r;  
34180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
34190 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f  ndex of right-mo
341a0 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20  st cell in left 
341b0 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69  sibling */.    i
341c0 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20  nt d;           
341d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
341e0 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65  irst cell to the
341f0 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73   left of right s
34200 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72  ibling */..    r
34210 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
34220 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20   1;.    d = r + 
34230 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
34240 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78    assert( d<nMax
34250 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
34260 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73  ert( r<nMaxCells
34270 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73   );.    while( s
34280 7a 52 69 67 68 74 3d 3d 30 20 0a 20 20 20 20 20  zRight==0 .     
34290 20 20 7c 7c 20 28 21 62 42 75 6c 6b 20 26 26 20    || (!bBulk && 
342a0 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64  szRight+szCell[d
342b0 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43  ]+2<=szLeft-(szC
342c0 65 6c 6c 5b 72 5d 2b 32 29 29 20 0a 20 20 20 20  ell[r]+2)) .    
342d0 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
342e0 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
342f0 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
34300 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
34310 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
34320 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
34330 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
34340 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
34350 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
34360 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
34370 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
34380 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
34390 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
343a0 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
343b0 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
343c0 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
343d0 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a  or pPage is.  **
343e0 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
343f0 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
34400 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
34410 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
34420 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
34430 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
34440 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
34450 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
34460 2a 0a 20 20 2a 2a 20 55 50 44 41 54 45 3a 20 20  *.  ** UPDATE:  
34470 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c  The assert() bel
34480 6f 77 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ow is not necess
34490 61 72 69 6c 79 20 74 72 75 65 20 69 66 20 74 68  arily true if th
344a0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
344b0 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2e  file is corrupt.
344c0 20 20 54 68 65 20 63 6f 72 72 75 70 74 69 6f 6e    The corruption
344d0 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74 65   will be detecte
344e0 64 20 61 6e 64 20 72 65 70 6f 72 74 65 64 20 6c  d and reported l
344f0 61 74 65 72 0a 20 20 2a 2a 20 69 6e 20 74 68 69  ater.  ** in thi
34500 73 20 70 72 6f 63 65 64 75 72 65 20 73 6f 20 74  s procedure so t
34510 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
34520 74 6f 20 61 63 74 20 75 70 6f 6e 20 69 74 20 6e  to act upon it n
34530 6f 77 2e 0a 20 20 2a 2f 0a 23 69 66 20 30 0a 20  ow..  */.#if 0. 
34540 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b   assert( cntNew[
34550 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74  0]>0 || (pParent
34560 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ->pgno==1 && pPa
34570 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  rent->nCell==0) 
34580 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 52 41  );.#endif..  TRA
34590 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
345a0 64 3a 20 25 64 20 25 64 20 25 64 20 20 22 2c 0a  d: %d %d %d  ",.
345b0 20 20 20 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67      apOld[0]->pg
345c0 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32  no, .    nOld>=2
345d0 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e   ? apOld[1]->pgn
345e0 6f 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e  o : 0,.    nOld>
345f0 3d 33 20 3f 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70  =3 ? apOld[2]->p
34600 67 6e 6f 20 3a 20 30 0a 20 20 29 29 3b 0a 0a 20  gno : 0.  ));.. 
34610 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
34620 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
34630 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
34640 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
34650 20 20 2a 2f 0a 20 20 69 66 28 20 61 70 4f 6c 64    */.  if( apOld
34660 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a  [0]->pgno<=1 ){.
34670 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34680 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34690 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
346a0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61  leanup;.  }.  pa
346b0 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b  geFlags = apOld[
346c0 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  0]->aData[0];.  
346d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
346e0 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
346f0 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
34700 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
34710 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
34720 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
34730 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
34740 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34750 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
34760 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
34770 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
34780 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
34790 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
347a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
347b0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
347c0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
347d0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
347e0 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 28   &pNew, &pgno, (
347f0 62 42 75 6c 6b 20 3f 20 31 20 3a 20 70 67 6e 6f  bBulk ? 1 : pgno
34800 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ), 0);.      if(
34810 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
34820 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
34830 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
34840 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
34850 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74  ..      /* Set t
34860 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
34870 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77  ntry for the new
34880 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a   sibling page. *
34890 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55  /.      if( ISAU
348a0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
348b0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
348c0 74 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50  t, pNew->pgno, P
348d0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61  TRMAP_BTREE, pPa
348e0 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29  rent->pgno, &rc)
348f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
34900 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34910 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
34920 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
34930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34940 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
34950 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
34960 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
34970 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
34980 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
34990 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
349a0 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c     freePage(apOl
349b0 64 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  d[i], &rc);.    
349c0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
349d0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
349e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
349f0 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
34a00 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
34a10 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
34a20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
34a30 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
34a40 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
34a50 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
34a60 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
34a70 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
34a80 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
34a90 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
34aa0 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
34ab0 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
34ac0 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
34ad0 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
34ae0 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
34af0 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
34b00 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
34b10 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
34b20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
34b30 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
34b40 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
34b50 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
34b60 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
34b70 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
34b80 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
34b90 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
34ba0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
34bb0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
34bc0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
34bd0 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
34be0 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
34bf0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
34c00 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
34c10 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
34c20 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
34c30 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
34c40 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
34c50 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
34c60 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f  = apNew[i]->pgno
34c70 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
34c80 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
34c90 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
34ca0 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d      if( apNew[j]
34cb0 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64  ->pgno<(unsigned
34cc0 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
34cd0 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
34ce0 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b     minV = apNew[
34cf0 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  j]->pgno;.      
34d00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
34d10 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20  minI>i ){.      
34d20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20  MemPage *pT;.   
34d30 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
34d40 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
34d50 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
34d60 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49        apNew[minI
34d70 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20  ] = pT;.    }.  
34d80 7d 0a 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a  }.  TRACE(("new:
34d90 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
34da0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
34db0 25 64 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65  %d)\n",.    apNe
34dc0 77 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65  w[0]->pgno, szNe
34dd0 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d  w[0],.    nNew>=
34de0 32 20 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67  2 ? apNew[1]->pg
34df0 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20  no : 0, nNew>=2 
34e00 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a  ? szNew[1] : 0,.
34e10 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70      nNew>=3 ? ap
34e20 4e 65 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[2]->pgno : 0
34e30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65  , nNew>=3 ? szNe
34e40 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[2] : 0,.    nN
34e50 65 77 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d  ew>=4 ? apNew[3]
34e60 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
34e70 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
34e80 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
34e90 3f 20 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f  ? apNew[4]->pgno
34ea0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20   : 0, nNew>=5 ? 
34eb0 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a  szNew[4] : 0));.
34ec0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
34ed0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
34ee0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
34ef0 61 67 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79  age) );.  put4by
34f00 74 65 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77  te(pRight, apNew
34f10 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b  [nNew-1]->pgno);
34f20 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  /*.  ** Even
34f30 6c 79 20 64 69 73 74 72 69 62 75 74 65 20 74 68  ly distribute th
34f40 65 20 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c  e data in apCell
34f50 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65  [] across the ne
34f60 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e  w pages..  ** In
34f70 73 65 72 74 20 64 69 76 69 64 65 72 20 63 65 6c  sert divider cel
34f80 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20  ls into pParent 
34f90 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  as necessary..  
34fa0 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f  */.  j = 0;.  fo
34fb0 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
34fc0 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65  ++){.    /* Asse
34fd0 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62  mble the new sib
34fe0 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
34ff0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
35000 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  = apNew[i];.    
35010 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
35020 6c 6c 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  lls );.    zeroP
35030 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c  age(pNew, pageFl
35040 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62  ags);.    assemb
35050 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74  lePage(pNew, cnt
35060 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c  New[i]-j, &apCel
35070 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d  l[j], &szCell[j]
35080 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
35090 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  New->nCell>0 || 
350a0 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e  (nNew==1 && cntN
350b0 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20  ew[0]==0) );.   
350c0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
350d0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a  Overflow==0 );..
350e0 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69      j = cntNew[i
350f0 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  ];..    /* If th
35100 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61  e sibling page a
35110 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77  ssembled above w
35120 61 73 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74  as not the right
35130 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20  -most sibling,. 
35140 20 20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64     ** insert a d
35150 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
35160 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
35170 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
35180 65 72 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c  ert( i<nNew-1 ||
35190 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20   j==nCell );.   
351a0 20 69 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a   if( j<nCell ){.
351b0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
351c0 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70  .      u8 *pTemp
351d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
351e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
351f0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
35200 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65      pCell = apCe
35210 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20  ll[j];.      sz 
35220 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65  = szCell[j] + le
35230 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
35240 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76      pTemp = &aOv
35250 66 6c 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61  flSpace[iOvflSpa
35260 63 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ce];.      if( !
35270 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
35280 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
35290 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
352a0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  ell, 4);.      }
352b0 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
352c0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
352d0 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
352e0 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
352f0 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
35300 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
35310 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
35320 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
35330 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
35340 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
35350 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
35360 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
35370 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
35380 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
35390 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
353a0 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
353b0 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
353c0 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
353d0 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
353e0 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
353f0 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
35400 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65  --;.        btre
35410 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
35420 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
35430 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
35440 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
35450 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70        sz = 4 + p
35460 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
35470 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  4], info.nKey);.
35480 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
35490 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
354a0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
354b0 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
354c0 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
354d0 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
354e0 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
354f0 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
35500 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
35510 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
35520 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
35530 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
35540 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
35550 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
35560 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
35570 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
35580 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
35590 73 65 65 20 62 74 72 65 65 50 61 72 73 65 43 65  see btreeParseCe
355a0 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73  llPtr(), 4 bytes
355b0 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20   is the minimum 
355c0 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20  size of.        
355d0 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75  ** any cell). Bu
355e0 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  t it is importan
355f0 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f  t to pass the co
35600 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20  rrect size to . 
35610 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74         ** insert
35620 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72  Cell(), so repar
35630 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e  se the cell now.
35640 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
35650 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
35660 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20   this can never 
35670 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c  happen in an SQL
35680 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61  ite data file, a
35690 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a  s all.        **
356a0 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65   cells are at le
356b0 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20  ast 4 bytes. It 
356c0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20  only happens in 
356d0 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20  b-trees used.   
356e0 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75       ** to evalu
356f0 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20  ate "IN (SELECT 
35700 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61  ...)" and simila
35710 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20  r clauses..     
35720 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
35730 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29  ( szCell[j]==4 )
35740 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
35750 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  rt(leafCorrectio
35760 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20  n==4);.         
35770 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
35780 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c  r(pParent, pCell
35790 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
357a0 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c     }.      iOvfl
357b0 53 70 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  Space += sz;.   
357c0 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
357d0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20  Bt->maxLocal+23 
357e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
357f0 20 69 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28   iOvflSpace <= (
35800 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  int)pBt->pageSiz
35810 65 20 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72  e );.      inser
35820 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  tCell(pParent, n
35830 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c  xDiv, pCell, sz,
35840 20 70 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67   pTemp, pNew->pg
35850 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
35860 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
35870 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  K ) goto balance
35880 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
35890 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
358a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
358b0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
358c0 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b  ) );..      j++;
358d0 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a  .      nxDiv++;.
358e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
358f0 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a  rt( j==nCell );.
35900 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30    assert( nOld>0
35910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
35920 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70  ew>0 );.  if( (p
35930 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c  ageFlags & PTF_L
35940 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  EAF)==0 ){.    u
35950 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43  8 *zChild = &apC
35960 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
35970 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  ta[8];.    memcp
35980 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
35990 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69  ->aData[8], zChi
359a0 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69  ld, 4);.  }..  i
359b0 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61  f( isRoot && pPa
359c0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  rent->nCell==0 &
359d0 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  & pParent->hdrOf
359e0 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e  fset<=apNew[0]->
359f0 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20  nFree ){.    /* 
35a00 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
35a10 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20   the b-tree now 
35a20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
35a30 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c  s. The only sibl
35a40 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  ing.    ** page 
35a50 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
35a60 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
35a70 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  . Copy the conte
35a80 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  nts of the.    *
35a90 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74  * child page int
35aa0 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65  o the parent, de
35ab0 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65  creasing the ove
35ac0 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74  rall height of t
35ad0 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65  he.    ** b-tree
35ae0 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e   structure by on
35af0 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72  e. This is descr
35b00 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c  ibed as the "bal
35b10 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a  ance-shallower".
35b20 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72      ** sub-algor
35b30 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63  ithm in some doc
35b40 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20  umentation..    
35b50 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69  **.    ** If thi
35b60 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
35b70 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68  uum database, th
35b80 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f  e call to copyNo
35b90 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20  deContent() .   
35ba0 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69   ** sets all poi
35bb0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
35bc0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
35bd0 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65  o database image
35be0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66   pages .    ** f
35bf0 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69  or which the poi
35c00 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77  nter is stored w
35c10 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ithin the conten
35c20 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a  t being copied..
35c30 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
35c40 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20  e second assert 
35c50 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74  below verifies t
35c60 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61  hat the child pa
35c70 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74  ge is defragment
35c80 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75  ed.    ** (it mu
35c90 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73  st be, as it was
35ca0 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63   just reconstruc
35cb0 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62  ted using assemb
35cc0 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a  lePage()). This.
35cd0 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74      ** is import
35ce0 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e  ant if the paren
35cf0 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  t page happens t
35d00 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74  o be page 1 of t
35d10 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
35d20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20  ** image.  */.  
35d30 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d    assert( nNew==
35d40 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
35d50 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65   apNew[0]->nFree
35d60 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65   == .        (ge
35d70 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d  t2byte(&apNew[0]
35d80 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65  ->aData[5])-apNe
35d90 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  w[0]->cellOffset
35da0 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c  -apNew[0]->nCell
35db0 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20  *2) .    );.    
35dc0 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
35dd0 61 70 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e  apNew[0], pParen
35de0 74 2c 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65  t, &rc);.    fre
35df0 65 50 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20  ePage(apNew[0], 
35e00 26 72 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  &rc);.  }else if
35e10 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
35e20 7b 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65  {.    /* Fix the
35e30 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
35e40 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
35e50 20 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65   cells that were
35e60 20 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e   shifted around.
35e70 20 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61   .    ** There a
35e80 72 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  re several diffe
35e90 72 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f  rent types of po
35ea0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
35eb0 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20  s that need to. 
35ec0 20 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77     ** be dealt w
35ed0 69 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74  ith by this rout
35ee0 69 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65  ine. Some of the
35ef0 73 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  se have been set
35f00 20 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20   already, but.  
35f10 20 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e    ** many have n
35f20 6f 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot. The followin
35f30 67 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a  g is a summary:.
35f40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
35f50 31 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61  1) The entries a
35f60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e  ssociated with n
35f70 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  ew sibling pages
35f80 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20   that were not. 
35f90 20 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69     **      sibli
35fa0 6e 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75  ngs when this fu
35fb0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
35fc0 64 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c  d. These have al
35fd0 72 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20  ready.    **    
35fe0 20 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64    been set. We d
35ff0 6f 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72  on't need to wor
36000 72 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62  ry about old sib
36010 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a  lings that were.
36020 20 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65      **      move
36030 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
36040 73 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67  st - the freePag
36050 65 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b  e() code has tak
36060 65 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20  en care.    **  
36070 20 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20      of those..  
36080 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29    **.    **   2)
36090 20 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   The pointer-map
360a0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
360b0 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ted with the fir
360c0 73 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  st overflow.    
360d0 2a 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20  **      page in 
360e0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  any overflow cha
360f0 69 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20  ins used by new 
36100 64 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54  divider cells. T
36110 68 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20  hese .    **    
36120 20 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65    have also alre
36130 61 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63  ady been taken c
36140 61 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e  are of by the in
36150 73 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e  sertCell() code.
36160 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
36170 20 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   3) If the sibli
36180 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
36190 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68   leaves, then th
361a0 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66  e child pages of
361b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c  .    **      cel
361c0 6c 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65  ls stored on the
361d0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d   sibling pages m
361e0 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70  ay need to be up
361f0 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
36200 20 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65    **   4) If the
36210 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
36220 72 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20  re not internal 
36230 69 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68  intkey nodes, th
36240 65 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20  en any.    **   
36250 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
36260 73 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20  s used by these 
36270 63 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74  cells may need t
36280 6f 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20  o be updated.   
36290 20 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e   **      (intern
362a0 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20  al intkey nodes 
362b0 6e 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f  never contain po
362c0 69 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c  inters to overfl
362d0 6f 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a  ow pages)..    *
362e0 2a 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66  *.    **   5) If
362f0 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
36300 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
36310 73 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e  s, then the poin
36320 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20  ter-map.    **  
36330 20 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20      entries for 
36340 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
36350 70 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69  pages of each si
36360 62 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20  bling may need. 
36370 20 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65     **      to be
36380 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a   updated..    **
36390 0a 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20  .    ** Cases 1 
363a0 61 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74 20  and 2 are dealt 
363b0 77 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74  with above by ot
363c0 68 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65  her code. The ne
363d0 78 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20  xt.    ** block 
363e0 64 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73  deals with cases
363f0 20 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65   3 and 4 and the
36400 20 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c   one after that,
36410 20 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20   case 5. Since. 
36420 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20     ** setting a 
36430 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
36440 79 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c  y is a relativel
36450 79 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  y expensive oper
36460 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20  ation, this.    
36470 2a 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74  ** code only set
36480 73 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  s pointer map en
36490 74 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20  tries for child 
364a0 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  or overflow page
364b0 73 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20  s that have.    
364c0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65  ** actually move
364d0 64 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e  d between pages.
364e0 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
364f0 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30   *pNew = apNew[0
36500 5d 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ];.    MemPage *
36510 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d  pOld = apCopy[0]
36520 3b 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66  ;.    int nOverf
36530 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65  low = pOld->nOve
36540 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69  rflow;.    int i
36550 4e 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e  NextOld = pOld->
36560 6e 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f  nCell + nOverflo
36570 77 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72  w;.    int iOver
36580 66 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f  flow = (nOverflo
36590 77 20 3f 20 70 4f 6c 64 2d 3e 61 69 4f 76 66 6c  w ? pOld->aiOvfl
365a0 5b 30 5d 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  [0] : -1);.    j
365b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
365c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365d0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
365e0 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
365f0 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
36600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
36620 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
36630 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
36640 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
36650 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
36660 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
36670 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
36680 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
36690 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
366a0 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
366b0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
366c0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
366d0 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
366e0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
366f0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
36700 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
36710 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
36720 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
36730 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
36740 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
36750 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  l. */.        as
36760 73 65 72 74 28 20 6a 2b 31 20 3c 20 41 72 72 61  sert( j+1 < Arra
36770 79 53 69 7a 65 28 61 70 43 6f 70 79 29 20 29 3b  ySize(apCopy) );
36780 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
36790 20 6a 2b 31 20 3c 20 6e 4f 6c 64 20 29 3b 0a 20   j+1 < nOld );. 
367a0 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61 70         pOld = ap
367b0 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20 20  Copy[++j];.     
367c0 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69 20     iNextOld = i 
367d0 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f  + !leafData + pO
367e0 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c 64  ld->nCell + pOld
367f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
36800 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e       if( pOld->n
36810 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
36820 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77 20        nOverflow 
36830 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
36840 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76  w;.          iOv
36850 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c 65  erflow = i + !le
36860 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 61  afData + pOld->a
36870 69 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  iOvfl[0];.      
36880 20 20 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69    }.        isDi
36890 76 69 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74  vider = !leafDat
368a0 61 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  a;  .      }..  
368b0 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
368c0 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66  flow>0 || iOverf
368d0 6c 6f 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61  low<i );.      a
368e0 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c  ssert(nOverflow<
368f0 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76 66  2 || pOld->aiOvf
36900 6c 5b 30 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f 76  l[0]==pOld->aiOv
36910 66 6c 5b 31 5d 2d 31 29 3b 0a 20 20 20 20 20 20  fl[1]-1);.      
36920 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
36930 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 69 4f 76  <3 || pOld->aiOv
36940 66 6c 5b 31 5d 3d 3d 70 4f 6c 64 2d 3e 61 69 4f  fl[1]==pOld->aiO
36950 76 66 6c 5b 32 5d 2d 31 29 3b 0a 20 20 20 20 20  vfl[2]-1);.     
36960 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f   if( i==iOverflo
36970 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44  w ){.        isD
36980 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  ivider = 1;.    
36990 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72      if( (--nOver
369a0 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20  flow)>0 ){.     
369b0 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b       iOverflow++
369c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
369d0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
369e0 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20  ==cntNew[k] ){. 
369f0 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69         /* Cell i
36a00 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d   is the cell imm
36a10 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
36a20 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  ng the last cell
36a30 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20   on new.        
36a40 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  ** sibling page 
36a50 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  k. If the siblin
36a60 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20  gs are not leaf 
36a70 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20  pages of an.    
36a80 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d      ** intkey b-
36a90 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20  tree, then cell 
36aa0 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20 63  i is a divider c
36ab0 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ell.  */.       
36ac0 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b   pNew = apNew[++
36ad0 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
36ae0 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74  !leafData ) cont
36af0 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
36b00 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f      assert( j<nO
36b10 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ld );.      asse
36b20 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20  rt( k<nNew );.. 
36b30 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
36b40 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ell was original
36b50 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ly divider cell 
36b60 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29  (and is not now)
36b70 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20   or.      ** an 
36b80 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f  overflow cell, o
36b90 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61  r if the cell wa
36ba0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64  s located on a d
36bb0 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67  ifferent sibling
36bc0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62  .      ** page b
36bd0 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63  efore the balanc
36be0 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f  ing, then the po
36bf0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
36c00 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20  s associated.   
36c10 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63     ** with any c
36c20 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77  hild or overflow
36c30 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
36c40 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20  e updated.  */. 
36c50 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69 64       if( isDivid
36c60 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f  er || pOld->pgno
36c70 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a  !=pNew->pgno ){.
36c80 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61          if( !lea
36c90 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20  fCorrection ){. 
36ca0 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50           ptrmapP
36cb0 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ut(pBt, get4byte
36cc0 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52  (apCell[i]), PTR
36cd0 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d  MAP_BTREE, pNew-
36ce0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
36cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
36d00 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65  f( szCell[i]>pNe
36d10 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20  w->minLocal ){. 
36d20 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50           ptrmapP
36d30 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20  utOvflPtr(pNew, 
36d40 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b  apCell[i], &rc);
36d50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
36d60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
36d70 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ( !leafCorrectio
36d80 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  n ){.      for(i
36d90 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
36da0 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b 65  {.        u32 ke
36db0 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 70  y = get4byte(&ap
36dc0 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d  New[i]->aData[8]
36dd0 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
36de0 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20 50  pPut(pBt, key, P
36df0 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e  TRMAP_BTREE, apN
36e00 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63  ew[i]->pgno, &rc
36e10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36e20 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54  ..#if 0.    /* T
36e30 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  he ptrmapCheckPa
36e40 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61  ges() contains a
36e50 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
36e60 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20 74  ts that verify t
36e70 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70  hat.    ** all p
36e80 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73  ointer map pages
36e90 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63 74   are set correct
36ea0 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70  ly. This is help
36eb0 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a  ful while .    *
36ec0 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69  * debugging. Thi
36ed0 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73  s is usually dis
36ee0 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61 20  abled because a 
36ef0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
36f00 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73   may.    ** caus
36f10 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  e an assert() st
36f20 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e  atement to fail.
36f30 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43    */.    ptrmapC
36f40 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c  heckPages(apNew,
36f50 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d   nNew);.    ptrm
36f60 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70 50  apCheckPages(&pP
36f70 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69  arent, 1);.#endi
36f80 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  f.  }..  assert(
36f90 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
36fa0 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41   );.  TRACE(("BA
36fb0 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a  LANCE: finished:
36fc0 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63   old=%d new=%d c
36fd0 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  ells=%d\n",.    
36fe0 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77        nOld, nNew
36ff0 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a  , nCell));..  /*
37000 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
37010 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
37020 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
37030 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53  anup:.  sqlite3S
37040 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c  cratchFree(apCel
37050 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l);.  for(i=0; i
37060 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
37070 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
37080 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  ld[i]);.  }.  fo
37090 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
370a0 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
370b0 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  Page(apNew[i]);.
370c0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
370d0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
370e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
370f0 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  led when the roo
37100 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
37110 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 0a  ee structure is.
37120 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73  ** overfull (has
37130 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
37140 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a  rflow pages)..**
37150 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20  .** A new child 
37160 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
37170 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  d and the conten
37180 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ts of the curren
37190 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20  t root.** page, 
371a0 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c  including overfl
371b0 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f  ow cells, are co
371c0 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68  pied into the ch
371d0 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a  ild. The root.**
371e0 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76   page is then ov
371f0 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b  erwritten to mak
37200 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61  e it an empty pa
37210 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67 68  ge with the righ
37220 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e  t-child .** poin
37230 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ter pointing to 
37240 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a  the new page..**
37250 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
37260 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65  ning, all pointe
37270 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
37280 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
37290 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68  ages .** that th
372a0 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65  e new child-page
372b0 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f   now contains po
372c0 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75 70  inters to are up
372d0 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e  dated. The.** en
372e0 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  try correspondin
372f0 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67  g to the new rig
37300 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
37310 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20   of the root.** 
37320 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64  page is also upd
37330 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ated..**.** If s
37340 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68  uccessful, *ppCh
37350 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f  ild is set to co
37360 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  ntain a referenc
37370 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a  e to the child .
37380 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49  ** page and SQLI
37390 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
373a0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
373b0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
373c0 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c  quired.** to cal
373d0 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 20  l releasePage() 
373e0 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63  on *ppChild exac
373f0 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20  tly once. If an 
37400 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
37410 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
37420 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
37430 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74  ppChild is set t
37440 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
37450 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
37460 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74  r(MemPage *pRoot
37470 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68  , MemPage **ppCh
37480 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ild){.  int rc; 
37490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
374a0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
374b0 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
374c0 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
374d0 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d  emPage *pChild =
374e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
374f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   Pointer to a ne
37500 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
37510 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
37520 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
37530 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
37540 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
37550 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
37560 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74  red *pBt = pRoot
37570 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65  ->pBt;    /* The
37580 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73   BTree */..  ass
37590 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ert( pRoot->nOve
375a0 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73  rflow>0 );.  ass
375b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
375c0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
375d0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  ex) );..  /* Mak
375e0 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f  e pRoot, the roo
375f0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
37600 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20  tree, writable. 
37610 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a  Allocate a new .
37620 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77    ** page that w
37630 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
37640 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  ew right-child o
37650 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68  f pPage. Copy th
37660 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20  e contents.  ** 
37670 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72  of the node stor
37680 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f  ed on pRoot into
37690 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
376a0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  age..  */.  rc =
376b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
376c0 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  te(pRoot->pDbPag
376d0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
376e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
376f0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
37700 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c  ePage(pBt,&pChil
37710 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f  d,&pgnoChild,pRo
37720 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20  ot->pgno,0);.   
37730 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
37740 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20  (pRoot, pChild, 
37750 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49 53  &rc);.    if( IS
37760 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
37770 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
37780 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54  t, pgnoChild, PT
37790 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f  RMAP_BTREE, pRoo
377a0 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
377b0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
377c0 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c  c ){.    *ppChil
377d0 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  d = 0;.    relea
377e0 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
377f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
37800 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
37810 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37820 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62  able(pChild->pDb
37830 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
37840 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
37850 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
37860 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
37870 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
37880 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43  nCell==pRoot->nC
37890 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  ell );..  TRACE(
378a0 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
378b0 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
378c0 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c  n", pRoot->pgno,
378d0 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
378e0 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20  ..  /* Copy the 
378f0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66  overflow cells f
37900 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68  rom pRoot to pCh
37910 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ild */.  memcpy(
37920 70 43 68 69 6c 64 2d 3e 61 69 4f 76 66 6c 2c 20  pChild->aiOvfl, 
37930 70 52 6f 6f 74 2d 3e 61 69 4f 76 66 6c 2c 0a 20  pRoot->aiOvfl,. 
37940 20 20 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6e          pRoot->n
37950 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28  Overflow*sizeof(
37960 70 52 6f 6f 74 2d 3e 61 69 4f 76 66 6c 5b 30 5d  pRoot->aiOvfl[0]
37970 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68  ));.  memcpy(pCh
37980 69 6c 64 2d 3e 61 70 4f 76 66 6c 2c 20 70 52 6f  ild->apOvfl, pRo
37990 6f 74 2d 3e 61 70 4f 76 66 6c 2c 0a 20 20 20 20  ot->apOvfl,.    
379a0 20 20 20 20 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65       pRoot->nOve
379b0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f  rflow*sizeof(pRo
379c0 6f 74 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 3b  ot->apOvfl[0]));
379d0 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  .  pChild->nOver
379e0 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f  flow = pRoot->nO
379f0 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a  verflow;..  /* Z
37a00 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ero the contents
37a10 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20   of pRoot. Then 
37a20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61  install pChild a
37a30 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
37a40 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65  d. */.  zeroPage
37a50 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e  (pRoot, pChild->
37a60 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
37a70 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
37a80 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
37a90 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
37aa0 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
37ab0 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70  ..  *ppChild = p
37ac0 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Child;.  return 
37ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
37ae0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61  .** The page tha
37af0 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79  t pCur currently
37b00 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a   points to has j
37b10 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ust been modifie
37b20 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79  d in.** some way
37b30 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
37b40 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74  figures out if t
37b50 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  his modification
37b60 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72   means the.** tr
37b70 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ee needs to be b
37b80 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20  alanced, and if 
37b90 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70  so calls the app
37ba0 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
37bb0 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20  ng .** routine. 
37bc0 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  Balancing routin
37bd0 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
37be0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a  balance_quick().
37bf0 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65  **   balance_dee
37c00 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  per().**   balan
37c10 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a  ce_nonroot().*/.
37c20 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
37c30 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ce(BtCursor *pCu
37c40 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
37c50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
37c60 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75  t int nMin = pCu
37c70 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  r->pBt->usableSi
37c80 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38  ze * 2 / 3;.  u8
37c90 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
37ca0 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70  ace[13];.  u8 *p
37cb0 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53  Free = 0;..  TES
37cc0 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e  TONLY( int balan
37cd0 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20  ce_quick_called 
37ce0 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c  = 0 );.  TESTONL
37cf0 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  Y( int balance_d
37d00 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30  eeper_called = 0
37d10 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
37d20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
37d30 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d  ->iPage;.    Mem
37d40 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
37d50 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
37d60 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67  ];..    if( iPag
37d70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e==0 ){.      if
37d80 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
37d90 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ow ){.        /*
37da0 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
37db0 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  f the b-tree is 
37dc0 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69  overfull. In thi
37dd0 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a  s case call the.
37de0 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
37df0 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63  ce_deeper() func
37e00 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
37e10 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74   new child for t
37e20 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
37e30 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79       ** and copy
37e40 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
37e50 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f  tents of the roo
37e60 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68  t-page to it. Th
37e70 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78  e.        ** nex
37e80 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
37e90 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
37ea0 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c  balance the chil
37eb0 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  d page..        
37ec0 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65  */ .        asse
37ed0 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65  rt( (balance_dee
37ee0 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  per_called++)==0
37ef0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
37f00 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
37f10 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70  pPage, &pCur->ap
37f20 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20  Page[1]);.      
37f30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
37f50 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31   pCur->iPage = 1
37f60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
37f70 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
37f80 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
37f90 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20  aiIdx[1] = 0;.  
37fa0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37fb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d  pCur->apPage[1]-
37fc0 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
37fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
37fe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65  lse{.        bre
37ff0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
38000 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d  }else if( pPage-
38010 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
38020 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e   pPage->nFree<=n
38030 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65  Min ){.      bre
38040 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
38050 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63       MemPage * c
38060 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70  onst pParent = p
38070 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
38080 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  e-1];.      int 
38090 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75  const iIdx = pCu
380a0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31  r->aiIdx[iPage-1
380b0 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ];..      rc = s
380c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
380d0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
380e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
380f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
38100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
38110 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
38120 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
38130 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20  e->hasData.     
38140 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f      && pPage->nO
38150 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20  verflow==1.     
38160 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 69      && pPage->ai
38170 4f 76 66 6c 5b 30 5d 3d 3d 70 50 61 67 65 2d 3e  Ovfl[0]==pPage->
38180 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26  nCell.         &
38190 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21  & pParent->pgno!
381a0 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
381b0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69  Parent->nCell==i
381c0 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  Idx.        ){. 
381d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
381e0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
381f0 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
38200 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67   sibling of pPag
38210 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20  e on which.     
38220 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65       ** to store
38230 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
38240 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  ll. balance_quic
38250 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65  k() inserts a ne
38260 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  w cell.         
38270 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74   ** into pParent
38280 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73  , which may caus
38290 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c  e pParent overfl
382a0 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20  ow. If this.    
382b0 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
382c0 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72  , the next inter
382d0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
382e0 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
382f0 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20  e pParent .     
38300 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68       ** use eith
38310 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  er balance_nonro
38320 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f  ot() or balance_
38330 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20  deeper(). Until 
38340 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
38350 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f  * happens, the o
38360 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
38370 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42  stored in the aB
38380 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
38390 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  [].          ** 
383a0 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20  buffer. .       
383b0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
383c0 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  ** The purpose o
383d0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
383e0 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63  assert() is to c
383f0 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61  heck that only a
38400 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
38410 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c  ngle call to bal
38420 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
38430 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61  made for each ca
38440 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll