/ Hex Artifact Content
Login

Artifact 51e4af60aa467d6a78b39346986cd607fe5d29c1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
0910: 50 50 4c 45 5f 5f 29 20 26 26 20 21 64 65 66 69  PPLE__) && !defi
0920: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
0930: 20 26 26 20 21 64 65 66 69 6e 65 64 28 54 48 33   && !defined(TH3
0940: 5f 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 29 0a  _COMPATIBILITY).
0950: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 67 6c 6f 62    /* Enable glob
0960: 61 6c 20 73 68 61 72 65 64 20 63 61 63 68 65 20  al shared cache 
0970: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 62  function for deb
0980: 75 67 67 69 6e 67 20 61 6e 64 20 75 6e 69 74 20  ugging and unit 
0990: 74 65 73 74 73 2c 20 0a 20 20 2a 2a 20 62 75 74  tests, .  ** but
09a0: 20 6e 6f 74 20 66 6f 72 20 72 65 6c 65 61 73 65   not for release
09b0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   */.  return SQL
09c0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 23 65 6c 73  ITE_MISUSE;.#els
09d0: 65 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e.  sqlite3Globa
09e0: 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
09f0: 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61  cheEnabled = ena
0a00: 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ble;.  return SQ
0a10: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
0a20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0a40: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0a50: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0a60: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0a70: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0a80: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0a90: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0aa0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0ab0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0ac0: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0ad0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0ae0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0af0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0b00: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0b10: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0b20: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0b30: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0b40: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0b50: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0b60: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0b70: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0b80: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0b90: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0ba0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0bb0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0bc0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0bd0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0be0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0bf0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0c00: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0c10: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0c20: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0c30: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0c40: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0c50: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0c60: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c70: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0c80: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0c90: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ca0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0cb0: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0cc0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0cd0: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0ce0: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0cf0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d00: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0d10: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0d20: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0d30: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0d40: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0d50: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0d60: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0d70: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0d80: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0d90: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0da0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0db0: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0dc0: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0dd0: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0de0: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0df0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0e00: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0e10: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0e20: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0e30: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0e40: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0e50: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0e60: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0e70: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0e80: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0e90: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ea0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
0eb0: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
0ec0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ed0: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
0ee0: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
0ef0: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
0f00: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
0f10: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
0f20: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
0f30: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
0f40: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
0f50: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
0f60: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
0f70: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
0f80: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
0f90: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
0fa0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
0fb0: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
0fc0: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
0fd0: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
0fe0: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
0ff0: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1000: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1010: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1020: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1030: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1040: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
1050: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
1060: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
1070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1080: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
1090: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
10a0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
10b0: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
10c0: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
10d0: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
10e0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
10f0: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1100: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1110: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1120: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1130: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1140: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1150: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1160: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
1170: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
1180: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
1190: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
11a0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
11b0: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
11c0: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
11d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11e0: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
11f0: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1200: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1210: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1220: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1230: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1240: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
1250: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
1260: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
1270: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
1280: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
1290: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
12a0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
12b0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
12c0: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
12d0: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
12e0: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
12f0: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1300: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1310: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1320: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1330: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1340: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
1350: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
1360: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
1370: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
1380: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
1390: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
13a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
13b0: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
13c0: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
13d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
13e0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
13f0: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1400: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1410: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1420: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1430: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1440: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
1450: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
1460: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
1470: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
1480: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
1490: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
14a0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
14b0: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
14c0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
14d0: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
14e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
14f0: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1500: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1510: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1520: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1530: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1540: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1550: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
1560: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
1570: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
1580: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
1590: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
15a0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
15b0: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
15c0: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
15d0: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
15e0: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
15f0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1600: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1610: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1620: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1630: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1640: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
1650: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
1660: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
1670: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
1680: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
1690: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
16a0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
16b0: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
16c0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
16d0: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
16e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
16f0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1700: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1710: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1720: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1730: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1740: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
1750: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
1760: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
1770: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
1780: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
1790: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
17a0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
17b0: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
17c0: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
17d0: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
17e0: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
17f0: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1800: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1810: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1820: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1830: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1840: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
1850: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
1860: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
1870: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
1880: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
1890: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
18a0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
18b0: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
18c0: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
18d0: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
18e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
18f0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1900: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1910: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1920: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1930: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1940: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1950: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1960: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1970: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1980: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1990: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
19a0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
19b0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
19c0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
19d0: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
19e0: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
19f0: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1a00: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1a10: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1a20: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1a30: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1a40: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1a50: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1a60: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1a70: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1a80: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1a90: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1aa0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1ab0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1ac0: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1ad0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1ae0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1af0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1b00: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1b10: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1b20: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1b30: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1b40: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1b50: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1b60: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1b70: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1b80: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1b90: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1ba0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1bb0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1bc0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1bd0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1be0: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1bf0: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1c00: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1c10: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1c20: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1c30: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1c50: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1c60: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1c70: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1c80: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1c90: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1ca0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1cb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1cc0: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1cd0: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1ce0: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1cf0: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1d00: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1d10: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1d20: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1d30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1d40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1d50: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1d60: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1d70: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1d80: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1d90: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1da0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1db0: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1dc0: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1dd0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1de0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1df0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1e00: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1e10: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1e20: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1e30: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1e40: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1e50: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1e60: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1e70: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1e80: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ea0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
1eb0: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
1ec0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1ed0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
1ee0: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
1ef0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1f00: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1f10: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
1f20: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
1f30: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
1f40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
1f50: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
1f60: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
1f70: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1f80: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
1f90: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
1fa0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
1fb0: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
1fc0: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
1fd0: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
1fe0: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1ff0: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2000: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2010: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2020: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2030: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2040: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
2050: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
2060: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
2070: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
2080: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2090: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
20a0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
20b0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20c0: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
20d0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
20e0: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
20f0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2100: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2110: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2120: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2130: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2140: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
2150: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
2160: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
2170: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2180: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
2190: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
21a0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
21b0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
21c0: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
21d0: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
21e0: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
21f0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2200: 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73 45  r!=p && pBt->isE
2210: 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
2220: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
2230: 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
2240: 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
2250: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2260: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
2270: 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
2280: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2290: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
22a0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
22b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e  {.    /* The con
22c0: 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65  dition (pIter->e
22d0: 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20  Lock!=eLock) in 
22e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66  the following if
22f0: 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74  (...) .    ** st
2300: 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69 6d  atement is a sim
2310: 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a  plification of:.
2320: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2330: 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  (eLock==WRITE_LO
2340: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f  CK || pIter->eLo
2350: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a  ck==WRITE_LOCK).
2360: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69      **.    ** si
2370: 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
2380: 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   if eLock==WRITE
2390: 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f  _LOCK, then no o
23a0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  ther connection.
23b0: 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20      ** may hold 
23c0: 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20  a WRITE_LOCK on 
23d0: 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69  any table in thi
23e0: 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68  s file (since th
23f0: 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f  ere can.    ** o
2400: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
2410: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a  writer)..    */.
2420: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2430: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2440: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2450: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2460: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
2470: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2480: 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  || pIter->pBtree
2490: 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  ==p || pIter->eL
24a0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b  ock==READ_LOCK);
24b0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
24c0: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
24d0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
24e0: 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   && pIter->eLock
24f0: 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  !=eLock ){.     
2500: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2510: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2520: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
2530: 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  db);.      if( e
2540: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2550: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2560: 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69  rt( p==pBt->pWri
2570: 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ter );.        p
2580: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
2590: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
25a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
25b0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
25c0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  E;.    }.  }.  r
25d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
25f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2600: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
2610: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2620: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
2630: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
2640: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2650: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
2660: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
2670: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
2680: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
2690: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
26a0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
26b0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
26c0: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
26d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
26e0: 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f  ssumes the follo
26f0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61  wing:.**.**   (a
2700: 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ) The specified 
2710: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69  Btree object p i
2720: 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
2730: 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20   sharable.**    
2740: 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65     database (one
2750: 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72   with the BtShar
2760: 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67  ed.sharable flag
2770: 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a   set), and.**.**
2780: 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20     (b) No other 
2790: 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f  Btree objects ho
27a0: 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63  ld a lock that c
27b0: 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20  onflicts.**     
27c0: 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65    with the reque
27d0: 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20  sted lock (i.e. 
27e0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
27f0: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a  TableLock() has.
2800: 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79  **       already
2810: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64   been called and
2820: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
2830: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  _OK)..**.** SQLI
2840: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2850: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2860: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
2870: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  lly. SQLITE_NOME
2880: 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  M .** is returne
2890: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74  d if a malloc at
28a0: 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a  tempt fails..*/.
28b0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68  static int setSh
28c0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
28d0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
28e0: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
28f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2900: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2910: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
2920: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
2930: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2940: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2950: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2960: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2970: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2980: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
29a0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f  =0 );..  /* A co
29b0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
29c0: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
29d0: 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c  ed flag set will
29e0: 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20   never try to.  
29f0: 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64  ** obtain a read
2a00: 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73  -lock using this
2a10: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f   function. The o
2a20: 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62  nly read-lock ob
2a30: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61  tained.  ** by a
2a40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72   connection in r
2a50: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2a60: 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73  mode is on the s
2a70: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
2a80: 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  ** table, and th
2a90: 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  at lock is obtai
2aa0: 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69  ned in BtreeBegi
2ab0: 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20  nTrans().  */.  
2ac0: 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64  assert( 0==(p->d
2ad0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2ae0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2af0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2b00: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
2b10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
2b20: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2b30: 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65  ed on a sharable
2b40: 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74   b-tree after it
2b50: 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20   .  ** has been 
2b60: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
2b70: 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20  no other b-tree 
2b80: 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74  holds a conflict
2b90: 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  ing lock.  */.  
2ba0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2bb0: 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
2bc0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
2bd0: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2be0: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
2bf0: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
2c00: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
2c10: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
2c20: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
2c30: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
2c40: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2c50: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
2c60: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
2c70: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
2c80: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
2c90: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
2ca0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
2cb0: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
2cc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2cd0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2ce0: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
2cf0: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
2d00: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
2d10: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
2d20: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
2d30: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
2d40: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
2d50: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
2d60: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
2d70: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
2d80: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
2d90: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
2da0: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
2db0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2dc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dd0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2de0: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
2df0: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
2e00: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
2e10: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
2e20: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
2e30: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
2e40: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
2e50: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
2e60: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
2e70: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2e80: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
2e90: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
2ea0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
2eb0: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
2ec0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
2ed0: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
2ee0: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
2ef0: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
2f00: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
2f10: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
2f20: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
2f30: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
2f40: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
2f50: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
2f60: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
2f70: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
2f80: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
2f90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2fa0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2fb0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2fc0: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2fe0: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
2ff0: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3000: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3010: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3020: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3030: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3040: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
3050: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
3060: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
3070: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
3080: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
3090: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
30a0: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
30b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
30c0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
30d0: 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  en the BtShared.
30e0: 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61 62  isPending variab
30f0: 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  le.** may be inc
3100: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3120: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3130: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3140: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3150: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3160: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
3170: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
3180: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
3190: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
31a0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
31b0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
31c0: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
31d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
31e0: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
31f0: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3200: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3210: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3220: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
3230: 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  >isExclusive==0 
3240: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
3250: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
3260: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
3270: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
3280: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3290: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
32a0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
32b0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
32c0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
32d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
32e0: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
32f0: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3300: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3310: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3320: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3330: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
3340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3350: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
3360: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
3370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
3380: 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e  sert( pBt->isPen
3390: 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  ding==0 || pBt->
33a0: 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28  pWriter );.  if(
33b0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
33c0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72   ){.    pBt->pWr
33d0: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
33e0: 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
33f0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   0;.    pBt->isP
3400: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65  ending = 0;.  }e
3410: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
3420: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
3430: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
3440: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
3450: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
3460: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
3470: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3480: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3490: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
34a0: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
34b0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
34c0: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
34d0: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
34e0: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
34f0: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3500: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3510: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
3520: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
3530: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
3540: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73 50    ** set the isP
3550: 65 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20 30  ending flag to 0
3560: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
3570: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  If there is not 
3580: 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74  currently a writ
3590: 65 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72 65  er, then BtShare
35a0: 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73 74  d.isPending must
35b0: 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20  .    ** be zero 
35c0: 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73  already. So this
35d0: 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61   next line is ha
35e0: 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63  rmless in that c
35f0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
3600: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3610: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
3620: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
3630: 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65  hanges all write
3640: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42  -locks held by B
3650: 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64  tree p into read
3660: 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69  -locks..*/.stati
3670: 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65  c void downgrade
3680: 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
3690: 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  bleLocks(Btree *
36a0: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
36b0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
36c0: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
36d0: 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  ==p ){.    BtLoc
36e0: 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  k *pLock;.    pB
36f0: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3700: 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
3710: 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42  sive = 0;.    pB
3720: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30  t->isPending = 0
3730: 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d  ;.    for(pLock=
3740: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
3750: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
3760: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
3770: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  sert( pLock->eLo
3780: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
3790: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
37a0: 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  p );.      pLock
37b0: 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  ->eLock = READ_L
37c0: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  OCK;.    }.  }.}
37d0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
37e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
37f0: 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ACHE */..static 
3800: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
3810: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3820: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  ;  /* Forward re
3830: 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a  ference */../*.*
3840: 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  **** This routin
3850: 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  e is used inside
3860: 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c   of assert() onl
3870: 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72  y ****.**.** Ver
3880: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
3890: 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75  sor holds the mu
38a0: 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61  tex on its BtSha
38b0: 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  red.*/.#ifdef SQ
38c0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
38d0: 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64  c int cursorHold
38e0: 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20  sMutex(BtCursor 
38f0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  *p){.  return sq
3900: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3910: 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b  (p->pBt->mutex);
3920: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
3930: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3940: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49  INCRBLOB./*.** I
3950: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3960: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
3970: 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f   cache for curso
3980: 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a  r pCur, if any..
3990: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
39a0: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
39b0: 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20  wCache(BtCursor 
39c0: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
39d0: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
39e0: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
39f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
3a00: 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70  >aOverflow);.  p
3a10: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
3a20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
3a30: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
3a40: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
3a50: 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72  ache for all cur
3a60: 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  sors opened.** o
3a70: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3a80: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3aa0: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
3ab0: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68  erflowCache(BtSh
3ac0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
3ad0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
3ae0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3af0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3b00: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
3b10: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
3b20: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
3b30: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3b40: 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d  lowCache(p);.  }
3b50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
3b60: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
3b70: 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  d before modifyi
3b80: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
3b90: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f  of a table.** to
3ba0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
3bb0: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
3bc0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
3bd0: 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20  n the.** row or 
3be0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20  one of the rows 
3bf0: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
3c00: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
3c10: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3c20: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
3c30: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
3c40: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
3c50: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
3c60: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
3c70: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
3c80: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
3c90: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
3ca0: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
3cb0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
3cc0: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
3cd0: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
3ce0: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
3cf0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
3d00: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
3d10: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
3d20: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
3d30: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
3d40: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
3d50: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
3d60: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
3d70: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
3d80: 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69   on that specifi
3d90: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
3da0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3db0: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
3dc0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
3dd0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
3de0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3df0: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36  to check */.  i6
3e00: 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20  4 iRow,         
3e10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
3e20: 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  id that might be
3e30: 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69   changing */.  i
3e40: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e50: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3e60: 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62  f all rows are b
3e70: 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
3e80: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3e90: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
3ea0: 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b  t = pBtree->pBt;
3eb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3ec0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
3ed0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66  x(pBtree) );.  f
3ee0: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3ef0: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3f00: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73  ){.    if( p->is
3f10: 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
3f20: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
3f30: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
3f40: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
3f50: 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
3f60: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
3f70: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
3f80: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
3f90: 6e 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  ns when INCRBLOB
3fa0: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
3fb0: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
3fc0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3fd0: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3fe0: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
3ff0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
4000: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
4010: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
4020: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a  x,y,z).#endif /*
4030: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4040: 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  RBLOB */../*.** 
4050: 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20  Set bit pgno of 
4060: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4070: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4080: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
4090: 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20  .** when a page 
40a0: 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20  that previously 
40b0: 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62  contained data b
40c0: 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69  ecomes a free-li
40d0: 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65  st leaf .** page
40e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68  ..**.** The BtSh
40f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4100: 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74   bitvec exists t
4110: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e  o work around an
4120: 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20   obscure.** bug 
4130: 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  caused by the in
4140: 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f  teraction of two
4150: 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d   useful IO optim
4160: 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e  izations surroun
4170: 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73  ding.** free-lis
4180: 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a  t leaf pages:.**
4190: 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c  .**   1) When al
41a0: 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65  l data is delete
41b0: 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e  d from a page an
41c0: 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d  d the page becom
41d0: 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65  es.**      a fre
41e0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
41f0: 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  , the page is no
4200: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
4210: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
4220: 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20    (as free-list 
4230: 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61  leaf pages conta
4240: 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c  in no meaningful
4250: 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65   data). Sometime
4260: 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61  s.**      such a
4270: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65   page is not eve
4280: 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73  n journalled (as
4290: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
42a0: 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20  modified,.**    
42b0: 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75    why bother jou
42c0: 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a  rnalling it?)..*
42d0: 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61  *.**   2) When a
42e0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
42f0: 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20  page is reused, 
4300: 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  its content is n
4310: 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ot read.**      
4320: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
4330: 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20  e or written to 
4340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4350: 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a   (why should it.
4360: 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69  **      be, if i
4370: 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  t is not at all 
4380: 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a  meaningful?)..**
4390: 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65  .** By themselve
43a0: 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a  s, these optimiz
43b0: 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65  ations work fine
43c0: 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68   and provide a h
43d0: 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61  andy.** performa
43e0: 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c  nce boost to bul
43f0: 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65  k delete or inse
4400: 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48  rt operations. H
4410: 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20  owever, if.** a 
4420: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f  page is moved to
4430: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
4440: 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77  nd then reused w
4450: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a  ithin the same.*
4460: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  * transaction, a
4470: 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75   problem comes u
4480: 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  p. If the page i
4490: 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64  s not journalled
44a0: 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d   when.** it is m
44b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
44c0: 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20  -list and it is 
44d0: 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  also not journal
44e0: 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69  led when it.** i
44f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4500: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
4510: 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20  nd reused, then 
4520: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
4530: 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74  a.** may be lost
4540: 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  . In the event o
4550: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  f a rollback, it
4560: 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73   may not be poss
4570: 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  ible.** to resto
4580: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
4590: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
45a0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
45b0: 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f  *.** The solutio
45c0: 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65  n is the BtShare
45d0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
45e0: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
45f0: 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76   page is .** mov
4600: 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66  ed to become a f
4610: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4620: 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ge, the correspo
4630: 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20  nding bit is.** 
4640: 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65  set in the bitve
4650: 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65  c. Whenever a le
4660: 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61  af page is extra
4670: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4680: 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69  ee-list,.** opti
4690: 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65  mization 2 above
46a0: 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74   is omitted if t
46b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
46c0: 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a   bit is already.
46d0: 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72  ** set in BtShar
46e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20  ed.pHasContent. 
46f0: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
4700: 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63  the bitvec are c
4710: 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65  leared.** at the
4720: 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72   end of every tr
4730: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
4740: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65  atic int btreeSe
4750: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4760: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4770: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20  pgno){.  int rc 
4780: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
4790: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
47a0: 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65  tent ){.    asse
47b0: 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e  rt( pgno<=pBt->n
47c0: 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d  Page );.    pBt-
47d0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73  >pHasContent = s
47e0: 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
47f0: 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  te(pBt->nPage);.
4800: 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48      if( !pBt->pH
4810: 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  asContent ){.   
4820: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4830: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
4840: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4850: 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c  _OK && pgno<=sql
4860: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4870: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4880: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
4890: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42  ite3BitvecSet(pB
48a0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20  t->pHasContent, 
48b0: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
48c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
48d0: 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61   Query the BtSha
48e0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
48f0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  vector..**.** Th
4900: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4910: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65  alled when a fre
4920: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4930: 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
4940: 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73   the.** free-lis
4950: 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20  t for reuse. It 
4960: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66  returns false if
4970: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72   it is safe to r
4980: 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70  etrieve the.** p
4990: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
49a0: 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
49b0: 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
49c0: 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74  lag set. True ot
49d0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
49e0: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48  ic int btreeGetH
49f0: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4a00: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
4a10: 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70  no){.  Bitvec *p
4a20: 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74   = pBt->pHasCont
4a30: 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ent;.  return (p
4a40: 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65   && (pgno>sqlite
4a50: 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c  3BitvecSize(p) |
4a60: 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
4a70: 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a  est(p, pgno)));.
4a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28  }../*.** Clear (
4a90: 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53  destroy) the BtS
4aa0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4ab0: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73  t bitvec. This s
4ac0: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f  hould be.** invo
4ad0: 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  ked at the concl
4ae0: 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72  usion of each wr
4af0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite-transaction.
4b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4b10: 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
4b20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b30: 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69  Bt){.  sqlite3Bi
4b40: 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d  tvecDestroy(pBt-
4b50: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20  >pHasContent);. 
4b60: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
4b70: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
4b80: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
4b90: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
4ba0: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
4bb0: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
4bc0: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
4bd0: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
4be0: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
4bf0: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
4c00: 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  RESEEK..**.** Th
4c10: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
4c20: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
4c30: 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68  rsor is valid (h
4c40: 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  as eState==CURSO
4c50: 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f  R_VALID).** prio
4c60: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
4c70: 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a  s routine.  .*/.
4c80: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
4c90: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
4ca0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
4cb0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
4cc0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
4cd0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
4ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
4cf0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
4d00: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
4d10: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
4d20: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
4d30: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
4d40: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
4d50: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
4d60: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
4d70: 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  KeySize() cannot
4d80: 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49   fail */..  /* I
4d90: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
4da0: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
4db0: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
4dc0: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
4dd0: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
4de0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
4df0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
4e00: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
4e10: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
4e20: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
4e30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
4e40: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
4e50: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
4e60: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
4e70: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
4e80: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
4e90: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
4ea0: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
4eb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
4ec0: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
4ed0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76  >intKey ){.    v
4ee0: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  oid *pKey = sqli
4ef0: 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
4f00: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
4f10: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
4f20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4f30: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
4f40: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
4f50: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
4f60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4f70: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
4f80: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
4f90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4fb0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
4fc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4fd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4fe0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ff0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5000: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5010: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5020: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5030: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5040: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5050: 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
5060: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
5070: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
5080: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
5090: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
50a0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
50b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
50c0: 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65   -1;.    pCur->e
50d0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
50e0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
50f0: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
5100: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
5110: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5120: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5130: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5140: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5150: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5160: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5170: 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72  he table  with r
5180: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
5190: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
51a0: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
51b0: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
51c0: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
51d0: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
51e0: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
51f0: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5200: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
5210: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
5220: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5230: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
5240: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
5250: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
5260: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5270: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5280: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5290: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
52a0: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
52b0: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
52c0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
52d0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
52e0: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
52f0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
5300: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
5310: 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20  oot) && .       
5320: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
5330: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
5340: 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43    int rc = saveC
5350: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
5360: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
5370: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
5380: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
5390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
53a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
53b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
53c0: 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74  lear the current
53d0: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
53e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
53f0: 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
5400: 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
5410: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
5420: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5430: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
5440: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5450: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  );.  pCur->pKey 
5460: 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  = 0;.  pCur->eSt
5470: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
5480: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ALID;.}../*.** I
5490: 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  n this version o
54a0: 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70  f BtreeMoveto, p
54b0: 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20  Key is a packed 
54c0: 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20  index record.** 
54d0: 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72  such as is gener
54e0: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
54f0: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
5500: 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a  .  Unpack the.**
5510: 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e   record and then
5520: 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74   call BtreeMovet
5530: 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64  oUnpacked() to d
5540: 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73  o the work..*/.s
5550: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d  tatic int btreeM
5560: 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f  oveto(.  BtCurso
5570: 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20  r *pCur,     /* 
5580: 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  Cursor open on t
5590: 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73  he btree to be s
55a0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e  earched */.  con
55b0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
55c0: 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69   /* Packed key i
55d0: 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
55e0: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34  n index */.  i64
55f0: 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
5600: 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20   /* Integer key 
5610: 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a  for tables.  Siz
5620: 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e  e of pKey for in
5630: 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62  dices */.  int b
5640: 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ias,           /
5650: 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f  * Bias search to
5660: 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
5670: 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
5680: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
5690: 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
56a0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
56b0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
56c0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
56d0: 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63   code */.  Unpac
56e0: 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
56f0: 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ey;   /* Unpacke
5700: 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
5710: 20 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30   char aSpace[150
5720: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ];          /* T
5730: 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49  emp space for pI
5740: 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64  dxKey - to avoid
5750: 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20   a malloc */..  
5760: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5770: 61 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69  assert( nKey==(i
5780: 36 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a  64)(int)nKey );.
5790: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71      pIdxKey = sq
57a0: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
57b0: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
57c0: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
57d0: 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20   pKey,.         
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70               aSp
5800: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
5810: 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ce));.    if( pI
5820: 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
5830: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
5840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
5850: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
5860: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
5870: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
5880: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
5890: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
58a0: 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ;.  if( pKey ){.
58b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
58c0: 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
58d0: 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  ord(pIdxKey);.  
58e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
58f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
5900: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
5910: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
5920: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
5930: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
5940: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
5950: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
5960: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
5970: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
5980: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
5990: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
59a0: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
59b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
59c0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
59d0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
59e0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
59f0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5a00: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
5a10: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
5a20: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
5a30: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
5a40: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
5a50: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5a60: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5a70: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5a80: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5a90: 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
5aa0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
5ab0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5ac0: 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
5ad0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
5ae0: 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75  AULT ){.    retu
5af0: 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
5b00: 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65  t;.  }.  pCur->e
5b10: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
5b20: 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62  NVALID;.  rc = b
5b30: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
5b40: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75   pCur->pKey, pCu
5b50: 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75  r->nKey, 0, &pCu
5b60: 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  r->skipNext);.  
5b70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5b80: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
5b90: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5ba0: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65  );.    pCur->pKe
5bb0: 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  y = 0;.    asser
5bc0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
5bd0: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
5be0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5bf0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b  URSOR_INVALID );
5c00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5c10: 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73  ;.}..#define res
5c20: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5c30: 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53  on(p) \.  (p->eS
5c40: 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
5c50: 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20  UIRESEEK ? \.   
5c60: 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f        btreeResto
5c70: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
5c80: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
5c90: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
5ca0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
5cb0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
5cc0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
5cd0: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
5ce0: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
5cf0: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
5d00: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
5d10: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
5d20: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
5d30: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
5d40: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
5d50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d60: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
5d70: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
5d80: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
5d90: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
5da0: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
5db0: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
5dc0: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
5dd0: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
5de0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
5df0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
5e00: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
5e10: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
5e20: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
5e30: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
5e40: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
5e50: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
5e60: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5e70: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
5e80: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
5e90: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
5ea0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
5eb0: 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29 7b  ->skipNext!=0 ){
5ec0: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5ed0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5ee0: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
5ef0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
5f00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
5f10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5f20: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
5f30: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
5f40: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
5f50: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
5f60: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
5f70: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
5f80: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
5f90: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
5fa0: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
5fb0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
5fc0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
5fd0: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
5fe0: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
5ff0: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
6000: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
6010: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
6020: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
6030: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
6040: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
6050: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
6060: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
6070: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
6080: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
6090: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
60a0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
60b0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
60c0: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
60d0: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
60e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
60f0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
6100: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
6110: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
6120: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
6130: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
6140: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
6150: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
6160: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
6170: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
6180: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
6190: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
61a0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
61b0: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
61c0: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
61d0: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
61e0: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
61f0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
6200: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
6210: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
6220: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
6230: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
6240: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
6250: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
6260: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
6270: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
6280: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
6290: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
62a0: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
62b0: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
62c0: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
62d0: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
62e0: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
62f0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
6300: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
6310: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
6320: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
6330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
6340: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
6350: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
6360: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
6370: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
6380: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
6390: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
63a0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
63b0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
63c0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
63d0: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
63e0: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
63f0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
6400: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
6410: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
6420: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
6430: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
6440: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
6450: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6460: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
6470: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
6480: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
6490: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
64a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
64b0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
64c0: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
64d0: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
64e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
64f0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
6500: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
6510: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
6520: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
6530: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
6540: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
6550: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
6560: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
6570: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
6580: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
65a0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
65b0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
65c0: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
65d0: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
65e0: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
65f0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
6600: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
6610: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6620: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
6630: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
6640: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
6650: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
6660: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
6670: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
6680: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
6690: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
66a0: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
66b0: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
66c0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
66d0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
66e0: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
66f0: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
6700: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
6710: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
6720: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
6730: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
6740: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
6750: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
6760: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
6770: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
6780: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
6790: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
67a0: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
67b0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
67c0: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
67d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
67e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
67f0: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
6800: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
6810: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6820: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
6830: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
6840: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
6850: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6860: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
6870: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
6880: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
6890: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
68a0: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
68b0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
68c0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
68d0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
68e0: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
68f0: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
6900: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
6910: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
6920: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
6930: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
6940: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
6950: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
6960: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
6970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6980: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
6990: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
69a0: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
69b0: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
69c0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
69d0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
69e0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
69f0: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
6a00: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
6a10: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
6a20: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
6a30: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
6a40: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
6a50: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
6a60: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
6a70: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
6a80: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
6a90: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
6aa0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
6ab0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
6ac0: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
6ad0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6ae0: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6af0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6b00: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6b10: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6b20: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
6b30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
6b40: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
6b50: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
6b60: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
6b70: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
6b80: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
6b90: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69  trmap, key);.  i
6ba0: 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20  f( offset<0 ){. 
6bb0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
6bc0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6bd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6be0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6bf0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
6c00: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
6c10: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
6c20: 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70  .  assert( pETyp
6c30: 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70  e!=0 );.  *pETyp
6c40: 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73  e = pPtrmap[offs
6c50: 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f  et];.  if( pPgno
6c60: 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34   ) *pPgno = get4
6c70: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6c80: 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c  fset+1]);..  sql
6c90: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
6ca0: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a  DbPage);.  if( *
6cb0: 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54  pEType<1 || *pET
6cc0: 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53  ype>5 ) return S
6cd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6ce0: 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  PT;.  return SQL
6cf0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
6d00: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
6d10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
6d20: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
6d30: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
6d40: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
6d50: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
6d60: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6d70: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6d80: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
6d90: 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   rc).#endif../*.
6da0: 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65  ** Given a btree
6db0: 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c   page and a cell
6dc0: 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20   index (0 means 
6dd0: 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f  the first cell o
6de0: 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31  n.** the page, 1
6df0: 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e   means the secon
6e00: 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66  d cell, and so f
6e10: 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70  orth) return a p
6e20: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
6e30: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a   cell content..*
6e40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6e50: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
6e60: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
6e70: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
6e80: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
6e90: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
6ea0: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
6eb0: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
6ec0: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28  Page & get2byte(
6ed0: 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d  &(P)->aData[(P)-
6ee0: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49  >cellOffset+2*(I
6ef0: 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69  )]))).#define fi
6f00: 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f 2c 49  ndCellv2(D,M,O,I
6f10: 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79 74 65  ) (D+(M&get2byte
6f20: 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29 29 0a  (D+(O+2*(I))))).
6f30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d  ../*.** This a m
6f40: 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72 73  ore complex vers
6f50: 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28  ion of findCell(
6f60: 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72  ) that works for
6f70: 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 64  .** pages that d
6f80: 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  o contain overfl
6f90: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  ow cells..*/.sta
6fa0: 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72  tic u8 *findOver
6fb0: 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65  flowCell(MemPage
6fc0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
6fd0: 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ll){.  int i;.  
6fe0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
6ff0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
7000: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
7010: 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e  .  for(i=pPage->
7020: 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d  nOverflow-1; i>=
7030: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
7040: 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f   k;.    struct _
7050: 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b  OvflCell *pOvfl;
7060: 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50  .    pOvfl = &pP
7070: 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20  age->aOvfl[i];. 
7080: 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64     k = pOvfl->id
7090: 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43  x;.    if( k<=iC
70a0: 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
70b0: 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k==iCell ){.   
70c0: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66       return pOvf
70d0: 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  l->pCell;.      
70e0: 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b  }.      iCell--;
70f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7100: 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  urn findCell(pPa
7110: 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f  ge, iCell);.}../
7120: 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c  *.** Parse a cel
7130: 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20  l content block 
7140: 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  and fill in the 
7150: 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75  CellInfo structu
7160: 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72  re.  There.** ar
7170: 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  e two versions o
7180: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
7190: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
71a0: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
71b0: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
71c0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
71d0: 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65 43   and btreeParseC
71e0: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
71f0: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
7200: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
7210: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
7220: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
7230: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
7240: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
7250: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
7260: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
7270: 20 6f 66 0a 2a 2a 20 62 74 72 65 65 50 61 72 73   of.** btreePars
7280: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
7290: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
72a0: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
72b0: 61 73 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  aster..*/.static
72c0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
72d0: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
72e0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
72f0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
7300: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
7310: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
7330: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
7340: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
7350: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
7360: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
7370: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
7380: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20  */.){.  u16 n;  
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
73b0: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
73c0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
73d0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
73e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
73f0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
7400: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
7410: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7420: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
7430: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
7440: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
7450: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
7460: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
7470: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
7480: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
7490: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
74a0: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
74b0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
74c0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
74d0: 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
74e0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
74f0: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  .      n += getV
7500: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
7510: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
7520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
7530: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
7540: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
7550: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
7560: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
7570: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
7580: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
7590: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
75a0: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
75b0: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
75c0: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
75d0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
75e0: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
75f0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
7600: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
7610: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
7620: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
7630: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
7640: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
7650: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
7660: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
7670: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
7680: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
7690: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
76a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
76b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
76c0: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
76d0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
76e0: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
76f0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
7700: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
7710: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
7720: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
7730: 20 20 20 69 66 28 20 28 70 49 6e 66 6f 2d 3e 6e     if( (pInfo->n
7740: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 6e 2b 6e  Size = (u16)(n+n
7750: 50 61 79 6c 6f 61 64 29 29 3c 34 20 29 20 70 49  Payload))<4 ) pI
7760: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a  nfo->nSize = 4;.
7770: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
7780: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
7790: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
77a0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d  verflow = 0;.  }
77b0: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
77c0: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
77d0: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
77e0: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
77f0: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
7800: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
7810: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7820: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7830: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
7840: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
7850: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
7860: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
7870: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
7880: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
7890: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
78a0: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
78b0: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
78c0: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
78d0: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
78e0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
78f0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
7900: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
7910: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7920: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7930: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
7940: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
7950: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
7960: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
7970: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
7980: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
7990: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
79a0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
79b0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
79c0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
79d0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
79e0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
79f0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7a00: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7a10: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7a20: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7a30: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
7a40: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
7a50: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
7a60: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
7a70: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
7a80: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
7a90: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7aa0: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7ab0: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
7ac0: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
7ad0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
7ae0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7af0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
7b00: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
7b10: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7b20: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7b30: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
7b40: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
7b50: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
7b60: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
7b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
7b80: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
7b90: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7ba0: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7bb0: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
7bc0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
7bd0: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
7be0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
7bf0: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
7c00: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
7c10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7c20: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 62 74  l, pInfo) \.  bt
7c30: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7c40: 28 70 50 61 67 65 29 2c 20 66 69 6e 64 43 65 6c  (pPage), findCel
7c50: 6c 28 28 70 50 61 67 65 29 2c 20 28 69 43 65 6c  l((pPage), (iCel
7c60: 6c 29 29 2c 20 28 70 49 6e 66 6f 29 29 0a 73 74  l)), (pInfo)).st
7c70: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7c80: 61 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  arseCell(.  MemP
7c90: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
7ca0: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
7cb0: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
7cc0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20  */.  int iCell, 
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ce0: 54 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20  The cell index. 
7cf0: 20 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30   First cell is 0
7d00: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
7d10: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
7d20: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
7d30: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
7d40: 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  parseCell(pPage,
7d50: 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   iCell, pInfo);.
7d60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
7d70: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7d80: 72 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  r of bytes that 
7d90: 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20  a Cell needs in 
7da0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
7db0: 20 61 72 65 61 20 6f 66 20 74 68 65 20 62 74 72   area of the btr
7dc0: 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20 72 65  ee-page.  The re
7dd0: 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c  turn number incl
7de0: 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  udes the cell.**
7df0: 20 64 61 74 61 20 68 65 61 64 65 72 20 61 6e 64   data header and
7e00: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f   the local paylo
7e10: 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e 79 20  ad, but not any 
7e20: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6f 72  overflow page or
7e30: 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20 75 73  .** the space us
7e40: 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c 20 70  ed by the cell p
7e50: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
7e60: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
7e70: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
7e80: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
7e90: 75 38 20 2a 70 49 74 65 72 20 3d 20 26 70 43 65  u8 *pIter = &pCe
7ea0: 6c 6c 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  ll[pPage->childP
7eb0: 74 72 53 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e  trSize];.  u32 n
7ec0: 53 69 7a 65 3b 0a 0a 23 69 66 64 65 66 20 53 51  Size;..#ifdef SQ
7ed0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
7ee0: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
7ef0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
7f00: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
7f10: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
7f20: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
7f30: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
7f40: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
7f50: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
7f60: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
7f70: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
7f80: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
7f90: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
7fa0: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
7fb0: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
7fc0: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
7fd0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
7fe0: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
7ff0: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
8000: 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
8010: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
8020: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
8030: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
8040: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
8050: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
8060: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
8070: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
8080: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
8090: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
80a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
80b0: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
80c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
80d0: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
80e0: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
80f0: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
8100: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
8110: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
8120: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
8130: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
8140: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
8150: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
8160: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
8170: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
8180: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
8190: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
81a0: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
81b0: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
81c0: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
81d0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
81e0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
81f0: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74  nSize);.  }..  t
8200: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
8210: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
8220: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
8230: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
8240: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
8250: 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61   nSize>pPage->ma
8260: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  xLocal ){.    in
8270: 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61  t minLocal = pPa
8280: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8290: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
82a0: 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69  al + (nSize - mi
82b0: 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65  nLocal) % (pPage
82c0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
82d0: 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74  e - 4);.    test
82e0: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
82f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
8300: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 53      testcase( nS
8310: 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ize==pPage->maxL
8320: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
8330: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
8340: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
8350: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
8360: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
8370: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
8380: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
8390: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
83a0: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
83b0: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
83c0: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
83d0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
83e0: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
83f0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
8400: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
8410: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
8420: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
8430: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8440: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61 72  EBUG./* This var
8450: 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69  iation on cellSi
8460: 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64 20  zePtr() is used 
8470: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
8480: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  () statements.**
8490: 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69 63   only. */.static
84a0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
84b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
84c0: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
84d0: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
84e0: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
84f0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
8500: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
8510: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
8520: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
8530: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
8540: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
8550: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
8560: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
8570: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
8580: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
8590: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
85a0: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
85b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
85c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
85d0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
85e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
85f0: 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52   *pCell, int *pR
8600: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
8610: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
8620: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
8630: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
8640: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
8650: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
8660: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
8670: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
8680: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
8690: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
86a0: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
86b0: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
86c0: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
86d0: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
86e0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
86f0: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72  rflow]);.    ptr
8700: 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42  mapPut(pPage->pB
8710: 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  t, ovfl, PTRMAP_
8720: 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
8730: 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20  ->pgno, pRC);.  
8740: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
8750: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
8760: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
8770: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
8780: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
8790: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
87a0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
87b0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
87c0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
87d0: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
87e0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
87f0: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
8800: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
8810: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8820: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8830: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
8840: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
8850: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
8860: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8870: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8880: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
8890: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
88a0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
88b0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
88c0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88e0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
88f0: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
8900: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8920: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8930: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8940: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8950: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8960: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8970: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8980: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
8990: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
89a0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
89b0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
89c0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
89d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
89e0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
89f0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
8a00: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
8a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8a20: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8a30: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8a40: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8a50: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8a60: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8a70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8a80: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
8a90: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
8aa0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
8ab0: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
8ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
8ad0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
8ae0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
8af0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
8b00: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
8b10: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8b20: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8b30: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8b40: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8b50: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8b60: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8b70: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8b80: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
8b90: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
8ba0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
8bb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8bc0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
8bd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
8be0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8bf0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8c00: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
8c10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8c20: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8c30: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8c40: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8c50: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8c60: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8c70: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8c80: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
8c90: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
8ca0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
8cb0: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
8cc0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
8cd0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
8ce0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
8cf0: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
8d00: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8d10: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
8d20: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
8d30: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
8d40: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
8d50: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
8d60: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
8d70: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
8d80: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
8d90: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
8da0: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
8db0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
8dc0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
8dd0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
8de0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
8df0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
8e00: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8e10: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8e20: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8e30: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8e40: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
8e50: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8e60: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
8e70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8e80: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
8e90: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
8ea0: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
8eb0: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
8ec0: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
8ed0: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
8ee0: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
8ef0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56  SQLITE_ENABLE_OV
8f00: 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43  ERSIZE_CELL_CHEC
8f10: 4b 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20  K is defined .  
8f20: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c    */.    if( pc<
8f30: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
8f40: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
8f50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8f60: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8f70: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8f80: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
8f90: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
8fa0: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
8fb0: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
8fc0: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
8fd0: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
8fe0: 3d 20 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69  = size;.#if defi
8ff0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9000: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9010: 43 48 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63  CHECK).    if( c
9020: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29  brk<iCellFirst )
9030: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
9040: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
9050: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  PT;.    }.#else.
9060: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
9070: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
9080: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
9090: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
90a0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
90b0: 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  T;.    }.#endif.
90c0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
90d0: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
90e0: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
90f0: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
9100: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
9110: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
9120: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9130: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
9140: 65 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e );.    memcpy(
9150: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
9160: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
9170: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
9180: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
9190: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43  assert( cbrk>=iC
91a0: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75  ellFirst );.  pu
91b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
91c0: 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61  +5], cbrk);.  da
91d0: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
91e0: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
91f0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
9200: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  = 0;.  memset(&d
9210: 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c  ata[iCellFirst],
9220: 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69   0, cbrk-iCellFi
9230: 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rst);.  assert( 
9240: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
9250: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9260: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
9270: 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74   cbrk-iCellFirst
9280: 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  !=pPage->nFree )
9290: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
92a0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
92b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
92c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
92d0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
92e0: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
92f0: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
9300: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
9310: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
9320: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
9330: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
9340: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
9350: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
9360: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
9370: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
9380: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
9390: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
93a0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
93b0: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
93c0: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
93d0: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
93e0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
93f0: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
9400: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
9410: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
9420: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
9430: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
9440: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
9450: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
9460: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
9470: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
9480: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
9490: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
94a0: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
94b0: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
94c0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
94d0: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
94e0: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
94f0: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
9500: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
9510: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
9520: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
9530: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
9540: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
9550: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
9560: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
9570: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
9580: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
9590: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
95a0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
95b0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
95c0: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
95d0: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
95e0: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
95f0: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
9600: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
9610: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
9620: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
9630: 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20 20 20    int nFrag;    
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9650: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9660: 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20 62   of fragmented b
9670: 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f  ytes on pPage */
9680: 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20  .  int top;     
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
96b0: 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f   byte of cell co
96c0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
96d0: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
96e0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
96f0: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
9700: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
9710: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
9720: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
9730: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
9740: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
9750: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20   usableSize; /* 
9760: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 74  Usable size of t
9770: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 0a 20 20  he page */.  .  
9780: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
9790: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
97a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
97b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
97c0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
97d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
97e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
97f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
9800: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
9810: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
9820: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
9830: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
9840: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
9850: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9860: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
9870: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
9880: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
9890: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 61 73 73  sableSize;.  ass
98a0: 65 72 74 28 20 6e 42 79 74 65 20 3c 20 75 73 61  ert( nByte < usa
98b0: 62 6c 65 53 69 7a 65 2d 38 20 29 3b 0a 0a 20 20  bleSize-8 );..  
98c0: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
98d0: 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  +7];.  assert( p
98e0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
98f0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
9900: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
9910: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
9920: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
9930: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f  age->nCell;.  to
9940: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
9950: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
9960: 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70  );.  if( gap>top
9970: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
9980: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9990: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
99a0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
99b0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
99c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
99d0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20 20 69 66  ap==top );..  if
99e0: 28 20 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20  ( nFrag>=60 ){. 
99f0: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 64 65 66     /* Always def
9a00: 72 61 67 6d 65 6e 74 20 68 69 67 68 6c 79 20 66  ragment highly f
9a10: 72 61 67 6d 65 6e 74 65 64 20 70 61 67 65 73 20  ragmented pages 
9a20: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  */.    rc = defr
9a30: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
9a40: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
9a50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
9a60: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
9a70: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
9a80: 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ]);.  }else if( 
9a90: 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20  gap+2<=top ){.  
9aa0: 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
9ab0: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
9ac0: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
9ad0: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
9ae0: 61 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74  atisfy .    ** t
9af0: 68 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20  he request. The 
9b00: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61  allocation is ma
9b10: 64 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73  de from the firs
9b20: 74 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a  t free slot in .
9b30: 20 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20      ** the list 
9b40: 74 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e  that is large en
9b50: 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61  ough to accomada
9b60: 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  te it..    */.  
9b70: 20 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a    int pc, addr;.
9b80: 20 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72      for(addr=hdr
9b90: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
9ba0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
9bb0: 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20  >0; addr=pc){.  
9bc0: 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20      int size;   
9bd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9be0: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
9bf0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  t */.      if( p
9c00: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c  c>usableSize-4 |
9c10: 7c 20 70 63 3c 61 64 64 72 2b 34 20 29 7b 0a 20  | pc<addr+4 ){. 
9c20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
9c30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
9c40: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
9c50: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
9c60: 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20  (&data[pc+2]);. 
9c70: 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e       if( size>=n
9c80: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
9c90: 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e  int x = size - n
9ca0: 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65  Byte;.        te
9cb0: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
9cc0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
9cd0: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
9ce0: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
9cf0: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
9d00: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
9d10: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
9d20: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
9d30: 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
9d40: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
9d50: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
9d60: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  . */.          m
9d70: 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72  emcpy(&data[addr
9d80: 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29  ], &data[pc], 2)
9d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61  ;.          data
9da0: 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e  [hdr+7] = (u8)(n
9db0: 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20  Frag + x);.     
9dc0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 69 7a     }else if( siz
9dd0: 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a  e+pc > usableSiz
9de0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
9df0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
9e00: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
9e10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e20: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
9e30: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
9e40: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
9e50: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
9e60: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  ount.          *
9e70: 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f  * for the portio
9e80: 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65  n used by the ne
9e90: 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f  w allocation. */
9ea0: 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62  .          put2b
9eb0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c  yte(&data[pc+2],
9ec0: 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   x);.        }. 
9ed0: 20 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70         *pIdx = p
9ee0: 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72  c + x;.        r
9ef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9f00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9f10: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74   }..  /* Check t
9f20: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72  o make sure ther
9f30: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
9f40: 65 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20  e in the gap to 
9f50: 73 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65  satisfy.  ** the
9f60: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66   allocation.  If
9f70: 20 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74   not, defragment
9f80: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
9f90: 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d  e( gap+2+nByte==
9fa0: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70  top );.  if( gap
9fb0: 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a  +2+nByte>top ){.
9fc0: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
9fd0: 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
9fe0: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
9ff0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
a000: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
a010: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
a020: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
a030: 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20  +nByte<=top );. 
a040: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   }...  /* Alloca
a050: 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74  te memory from t
a060: 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65 65  he gap in betwee
a070: 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  n the cell point
a080: 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e  er array.  ** an
a090: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
a0a0: 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62 74  nt area.  The bt
a0b0: 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63 61  reeInitPage() ca
a0c0: 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20  ll has already. 
a0d0: 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68   ** validated th
a0e0: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76  e freelist.  Giv
a0f0: 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65 65  en that the free
a100: 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74  list is valid, t
a110: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20  here.  ** is no 
a120: 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c  way that the all
a130: 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65  ocation can exte
a140: 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  nd off the end o
a150: 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  f the page..  **
a160: 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62 65   The assert() be
a170: 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 65  low verifies the
a180: 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e   previous senten
a190: 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d  ce..  */.  top -
a1a0: 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62  = nByte;.  put2b
a1b0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a1c0: 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74  , top);.  assert
a1d0: 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28  ( top+nByte <= (
a1e0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
a1f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
a200: 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72  *pIdx = top;.  r
a210: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
a230: 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68   a section of th
a240: 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74  e pPage->aData t
a250: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
a260: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74  ** The first byt
a270: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65  e of the new fre
a280: 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65  e block is pPage
a290: 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a  ->aDisk[start].*
a2a0: 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  * and the size o
a2b0: 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22  f the block is "
a2c0: 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a  size" bytes..**.
a2d0: 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65  ** Most of the e
a2e0: 66 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e  ffort here is in
a2f0: 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73  volved in coales
a300: 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  ing adjacent.** 
a310: 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f  free blocks into
a320: 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72   a single big fr
a330: 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  ee block..*/.sta
a340: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
a350: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
a360: 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74  , int start, int
a370: 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64   size){.  int ad
a380: 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b  dr, pbegin, hdr;
a390: 0a 20 20 69 6e 74 20 69 4c 61 73 74 3b 20 20 20  .  int iLast;   
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
a3c0: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
a3d0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
a3e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
a3f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
a400: 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  a;..  assert( pP
a410: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
a420: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a430: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a440: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a450: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74   );.  assert( st
a460: 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f  art>=pPage->hdrO
a470: 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63  ffset+6+pPage->c
a480: 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20  hildPtrSize );. 
a490: 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74 20   assert( (start 
a4a0: 2b 20 73 69 7a 65 29 20 3c 3d 20 28 69 6e 74 29  + size) <= (int)
a4b0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
a4c0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
a4d0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a4e0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a4f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
a500: 73 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29  ssert( size>=0 )
a510: 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  ;   /* Minimum c
a520: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
a530: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70  ..  if( pPage->p
a540: 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65  Bt->secureDelete
a550: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77   ){.    /* Overw
a560: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
a570: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
a580: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
a590: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20 20 2a  ure_delete.    *
a5a0: 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  * option is enab
a5b0: 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
a5c0: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
a5d0: 30 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  0, size);.  }.. 
a5e0: 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70 61 63   /* Add the spac
a5f0: 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  e back into the 
a600: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66  linked list of f
a610: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 74 65  reeblocks.  Note
a620: 20 74 68 61 74 0a 20 20 2a 2a 20 65 76 65 6e 20   that.  ** even 
a630: 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62  though the freeb
a640: 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68  lock list was ch
a650: 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e  ecked by btreeIn
a660: 69 74 50 61 67 65 28 29 2c 0a 20 20 2a 2a 20 62  itPage(),.  ** b
a670: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 64  treeInitPage() d
a680: 69 64 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  id not detect ov
a690: 65 72 6c 61 70 70 69 6e 67 20 63 65 6c 6c 73 20  erlapping cells 
a6a0: 6f 72 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  or.  ** freebloc
a6b0: 6b 73 20 74 68 61 74 20 6f 76 65 72 6c 61 70 70  ks that overlapp
a6c0: 65 64 20 63 65 6c 6c 73 2e 20 20 20 4e 6f 72 20  ed cells.   Nor 
a6d0: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 77  does it detect w
a6e0: 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c  hen the.  ** cel
a6f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 65  l content area e
a700: 78 63 65 65 64 73 20 74 68 65 20 76 61 6c 75 65  xceeds the value
a710: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
a720: 64 65 72 2e 20 20 49 66 20 74 68 65 73 65 0a 20  der.  If these. 
a730: 20 2a 2a 20 73 69 74 75 61 74 69 6f 6e 73 20 61   ** situations a
a740: 72 69 73 65 2c 20 74 68 65 6e 20 73 75 62 73 65  rise, then subse
a750: 71 75 65 6e 74 20 69 6e 73 65 72 74 20 6f 70 65  quent insert ope
a760: 72 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 63 6f  rations might co
a770: 72 72 75 70 74 0a 20 20 2a 2a 20 74 68 65 20 66  rrupt.  ** the f
a780: 72 65 65 6c 69 73 74 2e 20 20 53 6f 20 77 65 20  reelist.  So we 
a790: 64 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  do need to check
a7a0: 20 66 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20   for corruption 
a7b0: 77 68 69 6c 65 20 73 63 61 6e 6e 69 6e 67 0a 20  while scanning. 
a7c0: 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
a7d0: 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70  ..  */.  hdr = p
a7e0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
a7f0: 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20  .  addr = hdr + 
a800: 31 3b 0a 20 20 69 4c 61 73 74 20 3d 20 70 50 61  1;.  iLast = pPa
a810: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a820: 69 7a 65 20 2d 20 34 3b 0a 20 20 61 73 73 65 72  ize - 4;.  asser
a830: 74 28 20 73 74 61 72 74 3c 3d 69 4c 61 73 74 20  t( start<=iLast 
a840: 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  );.  while( (pbe
a850: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
a860: 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61  data[addr]))<sta
a870: 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29  rt && pbegin>0 )
a880: 7b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  {.    if( pbegin
a890: 3c 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20  <addr+4 ){.     
a8a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
a8b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
a8c0: 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62   }.    addr = pb
a8d0: 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  egin;.  }.  if( 
a8e0: 70 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a  pbegin>iLast ){.
a8f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a900: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a910: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
a920: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
a930: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
a940: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
a950: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
a960: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
a970: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
a980: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
a990: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
a9a0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
a9b0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75  Page->nFree + (u
a9c0: 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43  16)size;..  /* C
a9d0: 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74  oalesce adjacent
a9e0: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a   free blocks */.
a9f0: 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31    addr = hdr + 1
aa00: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
aa10: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
aa20: 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b  ata[addr]))>0 ){
aa30: 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20  .    int pnext, 
aa40: 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73  psize, x;.    as
aa50: 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64  sert( pbegin>add
aa60: 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  r );.    assert(
aa70: 20 70 62 65 67 69 6e 20 3c 3d 20 28 69 6e 74 29   pbegin <= (int)
aa80: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
aa90: 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20  leSize-4 );.    
aaa0: 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65  pnext = get2byte
aab0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 29 3b  (&data[pbegin]);
aac0: 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67 65 74  .    psize = get
aad0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
aae0: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  in+2]);.    if( 
aaf0: 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65 20 2b  pbegin + psize +
ab00: 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26 20 70   3 >= pnext && p
ab10: 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  next>0 ){.      
ab20: 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65 78 74  int frag = pnext
ab30: 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69 7a 65   - (pbegin+psize
ab40: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 66 72  );.      if( (fr
ab50: 61 67 3c 30 29 20 7c 7c 20 28 66 72 61 67 3e 28  ag<0) || (frag>(
ab60: 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d 29  int)data[hdr+7])
ab70: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ab80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ab90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
aba0: 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37        data[hdr+7
abb0: 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b 0a 20  ] -= (u8)frag;. 
abc0: 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79 74       x = get2byt
abd0: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b  e(&data[pnext]);
abe0: 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28  .      put2byte(
abf0: 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78  &data[pbegin], x
ac00: 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70 6e 65  );.      x = pne
ac10: 78 74 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  xt + get2byte(&d
ac20: 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20  ata[pnext+2]) - 
ac30: 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20 70 75  pbegin;.      pu
ac40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65  t2byte(&data[pbe
ac50: 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20  gin+2], x);.    
ac60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
ac70: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  r = pbegin;.    
ac80: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
ac90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
aca0: 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68  area begins with
acb0: 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65   a freeblock, re
acc0: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66  move it. */.  if
acd0: 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64  ( data[hdr+1]==d
ace0: 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61  ata[hdr+5] && da
acf0: 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b  ta[hdr+2]==data[
ad00: 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e  hdr+6] ){.    in
ad10: 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69  t top;.    pbegi
ad20: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
ad30: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
ad40: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72  memcpy(&data[hdr
ad50: 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69  +1], &data[pbegi
ad60: 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20  n], 2);.    top 
ad70: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ad80: 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74 32 62  [hdr+5]) + get2b
ad90: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
ada0: 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32 62 79  +2]);.    put2by
adb0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
adc0: 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73   top);.  }.  ass
add0: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
ade0: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
adf0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
ae00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ae10: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
ae20: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
ae30: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
ae40: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
ae50: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
ae60: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
ae70: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
ae80: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
ae90: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
aea0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
aeb0: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
aec0: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
aed0: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
aee0: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
aef0: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
af00: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
af10: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
af20: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
af30: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
af40: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
af50: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
af60: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
af70: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
af80: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
af90: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
afa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
afb0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
afc0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
afd0: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
afe0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
aff0: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
b000: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
b010: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
b020: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
b030: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
b040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
b050: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b060: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
b070: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
b080: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
b090: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
b0a0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
b0b0: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
b0c0: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
b0d0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
b0e0: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
b0f0: 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20  ->leaf;.  pBt = 
b100: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66  pPage->pBt;.  if
b110: 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46  ( flagByte==(PTF
b120: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
b130: 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 70  INTKEY) ){.    p
b140: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
b150: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
b160: 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65  Data = pPage->le
b170: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
b180: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
b190: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
b1a0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
b1b0: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
b1c0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
b1d0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
b1e0: 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  {.    pPage->int
b1f0: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Key = 0;.    pPa
b200: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30 3b  ge->hasData = 0;
b210: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
b220: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
b230: 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  ocal;.    pPage-
b240: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
b250: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c  >minLocal;.  }el
b260: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
b270: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
b280: 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
b290: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b2a0: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
b2b0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
b2c0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
b2d0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
b2e0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
b2f0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
b300: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
b310: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
b320: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
b330: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
b340: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
b350: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
b360: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
b370: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
b380: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
b390: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
b3a0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
b3b0: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
b3c0: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
b3d0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
b3e0: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
b3f0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
b400: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
b410: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
b420: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
b430: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
b440: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b450: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
b460: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
b470: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b480: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
b490: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
b4a0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
b4b0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
b4c0: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
b4d0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
b4e0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b4f0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b500: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
b510: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
b520: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
b530: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
b540: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
b550: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
b560: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
b570: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
b580: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
b590: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
b5b0: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
b5c0: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
b5d0: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
b5e0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
b5f0: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
b600: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
b610: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
b620: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
b630: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
b640: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
b650: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
b660: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
b670: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
b680: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
b690: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
b6a0: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
b6b0: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
b6c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
b6d0: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
b6e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b6f0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
b700: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
b710: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
b720: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
b730: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
b740: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
b750: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
b760: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
b770: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
b780: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
b790: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
b7a0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
b7b0: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
b7c0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
b7d0: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
b7e0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
b7f0: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
b800: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
b810: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
b820: 61 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 64  aData;.    if( d
b830: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
b840: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
b850: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b860: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
b870: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65  ssert( pBt->page
b880: 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74  Size>=512 && pBt
b890: 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33  ->pageSize<=6553
b8a0: 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  6 );.    pPage->
b8b0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
b8c0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
b8d0: 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e   1);.    pPage->
b8e0: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
b8f0: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
b900: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
b910: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
b920: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
b930: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
b940: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
b950: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
b960: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
b970: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61  hdr+5]);.    pPa
b980: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
b990: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
b9a0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ]);.    if( pPag
b9b0: 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c  e->nCell>MX_CELL
b9c0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
b9d0: 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20  * To many cells 
b9e0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67  for a single pag
b9f0: 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73  e.  The page mus
ba00: 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a  t be corrupt */.
ba10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ba20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ba30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74  ;.    }.    test
ba40: 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
ba50: 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
ba60: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
ba70: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
ba80: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
ba90: 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
baa0: 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a  t the end.    **
bab0: 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61   of page when pa
bac0: 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a  rsing a cell.  .
bad0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
bae0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
baf0: 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73  k of code checks
bb00: 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66   early to see if
bb10: 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a   a cell extends.
bb20: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
bb30: 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
bb40: 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
bb50: 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
bb60: 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72   to be .    ** r
bb70: 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f  eturned if it do
bb80: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
bb90: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
bba0: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
bbb0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65  ->nCell;.    iCe
bbc0: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
bbd0: 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66  ize - 4;.#if def
bbe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
bbf0: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
bc00: 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20  _CHECK).    {.  
bc10: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
bc20: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
bc30: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
bc40: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
bc50: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
bc60: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
bc70: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
bc80: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
bc90: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
bca0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
bcb0: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
bcc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
bcd0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
bce0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a  ta[cellOffset+i*
bcf0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  2]);.        tes
bd00: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
bd10: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20  First );.       
bd20: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
bd30: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
bd40: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
bd50: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
bd60: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
bd70: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
bd80: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bd90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bda0: 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
bdb0: 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
bdc0: 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  c]);.        tes
bdd0: 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
bde0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
bdf0: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
be00: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
be10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
be20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
be30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
be40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
be50: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
be60: 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20  llLast++;.    } 
be70: 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a   .#endif..    /*
be80: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
be90: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
bea0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
beb0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
bec0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
bed0: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
bee0: 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20  dr+7] + top;.   
bef0: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
bf00: 20 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20        u16 next, 
bf10: 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  size;.      if( 
bf20: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
bf30: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
bf40: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  .        /* Star
bf50: 74 20 6f 66 20 66 72 65 65 20 62 6c 6f 63 6b 20  t of free block 
bf60: 69 73 20 6f 66 66 20 74 68 65 20 70 61 67 65 20  is off the page 
bf70: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
bf80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
bf90: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
bfa0: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
bfb0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
bfc0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
bfd0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
bfe0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
bff0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
c000: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
c010: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
c020: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
c030: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
c040: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
c050: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
c060: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 09 2a 2a  last byte of..**
c070: 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20   the free-block 
c080: 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20  must lie on the 
c090: 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
c0a0: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
c0b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c0c0: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
c0d0: 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46        nFree = nF
c0e0: 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20  ree + size;.    
c0f0: 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20    pc = next;.   
c100: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
c110: 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20  is point, nFree 
c120: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d  contains the sum
c130: 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74   of the offset t
c140: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20  o the start.    
c150: 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  ** of the cell-c
c160: 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73  ontent area plus
c170: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
c180: 72 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e  ree bytes within
c190: 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c  .    ** the cell
c1a0: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49  -content area. I
c1b0: 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65  f this is greate
c1c0: 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c  r than the usabl
c1d0: 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66  e-size.    ** of
c1e0: 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
c1f0: 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  the page must be
c200: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
c210: 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20   check also.    
c220: 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
c230: 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
c240: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
c250: 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
c260: 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61  tent.    ** area
c270: 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
c280: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
c290: 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
c2a0: 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
c2b0: 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c   if( nFree>usabl
c2c0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
c2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c2e0: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
c2f0: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  }.    pPage->nFr
c300: 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65  ee = (u16)(nFree
c310: 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a   - iCellFirst);.
c320: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
c330: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
c340: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c350: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
c360: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
c370: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
c380: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
c390: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
c3a0: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
c3b0: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
c3c0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c3d0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
c3e0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
c3f0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
c400: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
c410: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
c420: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
c430: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
c440: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
c450: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c460: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
c470: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
c480: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
c490: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
c4a0: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
c4b0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
c4c0: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
c4d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
c4e0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
c4f0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
c500: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
c510: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
c520: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
c530: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
c540: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c550: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
c560: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
c570: 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 29  ->secureDelete )
c580: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
c590: 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d  ta[hdr], 0, pBt-
c5a0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64  >usableSize - hd
c5b0: 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68  r);.  }.  data[h
c5c0: 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67  dr] = (char)flag
c5d0: 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72  s;.  first = hdr
c5e0: 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73   + 8 + 4*((flags
c5f0: 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31  &PTF_LEAF)==0 ?1
c600: 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  :0);.  memset(&d
c610: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
c620: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
c630: 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
c640: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
c650: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
c660: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
c670: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
c680: 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
c690: 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
c6a0: 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
c6b0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c6c0: 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65  t = hdr;.  pPage
c6d0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66  ->cellOffset = f
c6e0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  irst;.  pPage->n
c6f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
c700: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67  assert( pBt->pag
c710: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42  eSize>=512 && pB
c720: 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35  t->pageSize<=655
c730: 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d  36 );.  pPage->m
c740: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
c750: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c760: 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  1);.  pPage->nCe
c770: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d  ll = 0;.  pPage-
c780: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a  >isInit = 1;.}..
c790: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
c7a0: 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64   DbPage obtained
c7b0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
c7c0: 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75  into a MemPage u
c7d0: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74  sed by.** the bt
c7e0: 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74  ree layer..*/.st
c7f0: 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
c800: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
c810: 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61 67  e(DbPage *pDbPag
c820: 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74  e, Pgno pgno, Bt
c830: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
c840: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
c850: 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74   (MemPage*)sqlit
c860: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c870: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
c880: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
c890: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c8a0: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
c8b0: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
c8c0: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
c8d0: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
c8e0: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
c8f0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c900: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
c910: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
c920: 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
c930: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
c940: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
c950: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
c960: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
c970: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
c980: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
c990: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
c9a0: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
c9b0: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
c9c0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
c9d0: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
c9e0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
c9f0: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
ca00: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
ca10: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
ca20: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
ca30: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
ca40: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
ca50: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
ca60: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
ca70: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
ca80: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
ca90: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
caa0: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
cab0: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
cac0: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
cad0: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
cae0: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
caf0: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
cb00: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
cb10: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
cb20: 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a  t btreeGetPage(.
cb30: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
cb40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
cb50: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
cb60: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
cb70: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
cb80: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
cb90: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
cba0: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
cbb0: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
cbc0: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
cbd0: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
cbe0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
cbf0: 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
cc00: 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
cc10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
cc20: 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
cc30: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
cc40: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
cc50: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
cc60: 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
cc70: 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
cc80: 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
cc90: 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43 6f  *)&pDbPage, noCo
cca0: 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63  ntent);.  if( rc
ccb0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
ccc0: 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
ccd0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
cce0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
ccf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
cd00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
cd10: 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
cd20: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
cd30: 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
cd40: 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
cd50: 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
cd60: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
cd70: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
cd80: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
cd90: 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
cda0: 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
cdb0: 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
cdc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
cdd0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
cde0: 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
cdf0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
ce00: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
ce10: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
ce20: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ce30: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ce40: 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
ce50: 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
ce60: 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
ce70: 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
ce80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
ce90: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
cea0: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
ceb0: 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
cec0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
ced0: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
cee0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
cef0: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
cf00: 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
cf10: 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
cf20: 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
cf30: 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
cf40: 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65  tatic Pgno btree
cf50: 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
cf60: 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75  ed *pBt){.  retu
cf70: 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  rn pBt->nPage;.}
cf80: 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65  .u32 sqlite3Btre
cf90: 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20  eLastPage(Btree 
cfa0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
cfb0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
cfc0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
cfd0: 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e  sert( ((p->pBt->
cfe0: 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30  nPage)&0x8000000
cff0: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
d000: 20 28 69 6e 74 29 62 74 72 65 65 50 61 67 65 63   (int)btreePagec
d010: 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
d020: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
d030: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
d040: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
d050: 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
d060: 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a 20 63  e is just a.** c
d070: 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70  onvenience wrapp
d080: 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61  er around separa
d090: 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  te calls to btre
d0a0: 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 0a  eGetPage() and .
d0b0: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
d0c0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ()..**.** If an 
d0d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
d0e0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a 70 70  en the value *pp
d0f0: 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 69  Page is set to i
d100: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
d110: 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
d120: 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
d130: 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
d140: 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
d150: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
d160: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
d170: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
d180: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
d190: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
d1a0: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
d1b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d1c0: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
d1d0: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
d1e0: 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20  **ppPage     /* 
d1f0: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
d200: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29  ointer here */.)
d210: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
d220: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d230: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
d240: 74 65 78 29 20 29 3b 0a 0a 20 20 69 66 28 20 70  tex) );..  if( p
d250: 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75  gno>btreePagecou
d260: 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
d270: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
d280: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
d290: 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
d2a0: 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
d2b0: 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
d2c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d2d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
d2e0: 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
d2f0: 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
d300: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d310: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
d320: 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
d330: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
d340: 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74 63 61 73  }.  }..  testcas
d350: 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20  e( pgno==0 );.  
d360: 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
d370: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  || rc==SQLITE_CO
d380: 52 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72  RRUPT );.  retur
d390: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
d3a0: 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65  elease a MemPage
d3b0: 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62  .  This should b
d3c0: 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  e called once fo
d3d0: 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20  r each prior.** 
d3e0: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74  call to btreeGet
d3f0: 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
d400: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
d410: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
d420: 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  {.  if( pPage ){
d430: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
d440: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
d450: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d460: 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72  pBt );.    asser
d470: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
d480: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
d490: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
d4a0: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61  *)pPage );.    a
d4b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d4c0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
d4d0: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
d4e0: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
d4f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d500: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d510: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d520: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
d530: 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44  rUnref(pPage->pD
d540: 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
d550: 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f  *.** During a ro
d560: 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65  llback, when the
d570: 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69   pager reloads i
d580: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
d590: 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20  the cache.** so 
d5a0: 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69  that the cache i
d5b0: 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  s restored to it
d5c0: 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
d5d0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
d5e0: 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74  .** the transact
d5f0: 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61  ion, for each pa
d600: 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73  ge restored this
d610: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d620: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
d630: 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20  outine needs to 
d640: 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20  reset the extra 
d650: 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20  data section at 
d660: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
d670: 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20  * page to agree 
d680: 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
d690: 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
d6a0: 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69  c void pageReini
d6b0: 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29  t(DbPage *pData)
d6c0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
d6d0: 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d  ge;.  pPage = (M
d6e0: 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
d6f0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
d700: 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ata);.  assert( 
d710: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d720: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
d730: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
d740: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
d750: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d760: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d770: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d780: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
d790: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
d7a0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d7b0: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
d7c0: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50  1 ){.      /* pP
d7d0: 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65  age might not be
d7e0: 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20   a btree page;  
d7f0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f  it might be an o
d800: 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
d810: 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20     ** or ptrmap 
d820: 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70  page or a free p
d830: 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63  age.  In those c
d840: 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  ases, the follow
d850: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  ing.      ** cal
d860: 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61  l to btreeInitPa
d870: 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
d880: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d890: 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
d8a0: 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
d8b0: 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
d8c0: 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
d8d0: 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
d8e0: 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50     ** btreeInitP
d8f0: 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20  age() be called 
d900: 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70  on every btree p
d910: 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20  age so we make. 
d920: 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c       ** the call
d930: 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20   for every page 
d940: 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f  that comes in fo
d950: 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f  r re-initing. */
d960: 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74  .      btreeInit
d970: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
d980: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
d990: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
d9a0: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
d9b0: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
d9c0: 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
d9d0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
d9e0: 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
d9f0: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
da00: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
da10: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
da20: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
da30: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
da40: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
da50: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
da60: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
da70: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
da80: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
da90: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
daa0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
dab0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
dac0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
dad0: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
dae0: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
daf0: 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65  .** then an ephe
db00: 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69  meral database i
db10: 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  s created.  The 
db20: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
db30: 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65  se might.** be e
db40: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65  xclusively in me
db50: 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  mory, or it migh
db60: 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73  t use a disk-bas
db70: 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  ed memory cache.
db80: 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20  .** Either way, 
db90: 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  the ephemeral da
dba0: 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61  tabase will be a
dbb0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
dbc0: 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71  eted .** when sq
dbd0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
dbe0: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
dbf0: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
dc00: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
dc10: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
dc20: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
dc30: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
dc40: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
dc50: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
dc60: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  s closed..**.** 
dc70: 54 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61  The "flags" para
dc80: 6d 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61  meter is a bitma
dc90: 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  sk that might co
dca0: 6e 74 61 69 6e 20 62 69 74 73 0a 2a 2a 20 42 54  ntain bits.** BT
dcb0: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
dcc0: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4e 4f   and/or BTREE_NO
dcd0: 5f 52 45 41 44 4c 4f 43 4b 2e 20 20 54 68 65 20  _READLOCK.  The 
dce0: 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43  BTREE_NO_READLOC
dcf0: 4b 0a 2a 2a 20 62 69 74 20 69 73 20 61 6c 73 6f  K.** bit is also
dd00: 20 73 65 74 20 69 66 20 74 68 65 20 53 51 4c 49   set if the SQLI
dd10: 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 66 6c  TE_NoReadlock fl
dd20: 61 67 73 20 69 73 20 73 65 74 20 69 6e 20 64 62  ags is set in db
dd30: 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20 54 68 65 73  ->flags..** Thes
dd40: 65 20 66 6c 61 67 73 20 61 72 65 20 70 61 73 73  e flags are pass
dd50: 65 64 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ed through into 
dd60: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
dd70: 28 29 20 61 6e 64 20 6d 75 73 74 0a 2a 2a 20 62  () and must.** b
dd80: 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65  e the same value
dd90: 73 20 61 73 20 50 41 47 45 52 5f 4f 4d 49 54 5f  s as PAGER_OMIT_
dda0: 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45  JOURNAL and PAGE
ddb0: 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 2e 0a 2a  R_NO_READLOCK..*
ddc0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
ddd0: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
dde0: 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
ddf0: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
de00: 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
de10: 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
de20: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
de30: 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
de40: 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
de50: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
de60: 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
de70: 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
de80: 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
de90: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
dea0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
deb0: 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
dec0: 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
ded0: 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
dee0: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
def0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
df00: 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
df10: 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
df20: 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
df30: 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
df40: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
df50: 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
df60: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
df70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
df80: 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
df90: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
dfa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
dfb0: 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
dfc0: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
dfd0: 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
dfe0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
dff0: 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
e000: 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
e010: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
e020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e030: 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
e040: 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
e050: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
e060: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
e070: 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
e080: 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
e090: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e0b0: 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
e0c0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
e0d0: 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0f0: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
e100: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
e110: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
e120: 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
e130: 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
e140: 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
e150: 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
e160: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
e170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
e180: 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
e190: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
e1a0: 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1c0: 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
e1d0: 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
e1e0: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
e1f0: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
e200: 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
e210: 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
e220: 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
e230: 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
e240: 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
e250: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
e260: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
e270: 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
e280: 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
e290: 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
e2a0: 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
e2b0: 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
e2c0: 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
e2d0: 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
e2e0: 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
e2f0: 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
e300: 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
e310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
e320: 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
e330: 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
e340: 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
e350: 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
e360: 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
e370: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
e380: 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
e390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3a0: 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
e3b0: 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
e3c0: 65 6d 6f 72 79 28 64 62 29 29 3b 0a 23 65 6e 64  emory(db));.#end
e3d0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
e3e0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e3f0: 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
e400: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e410: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
e420: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
e430: 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
e440: 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
e450: 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
e460: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
e470: 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
e480: 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
e490: 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
e4a0: 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
e4b0: 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
e4c0: 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
e4d0: 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
e4e0: 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
e4f0: 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
e500: 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
e510: 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
e520: 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
e530: 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
e540: 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
e550: 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
e560: 29 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c  );..  if( db->fl
e570: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4e 6f 52  ags & SQLITE_NoR
e580: 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 66  eadlock ){.    f
e590: 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4e 4f  lags |= BTREE_NO
e5a0: 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  _READLOCK;.  }. 
e5b0: 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
e5c0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
e5d0: 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
e5e0: 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
e5f0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
e600: 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
e610: 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
e620: 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
e630: 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
e640: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
e650: 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
e660: 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
e670: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
e680: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
e690: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
e6a0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
e6b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
e6c0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
e6d0: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
e6e0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
e6f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
e700: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
e710: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
e720: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
e730: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
e740: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
e750: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
e760: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
e770: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
e780: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
e790: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
e7a0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
e7b0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
e7c0: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
e7d0: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
e7e0: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
e7f0: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
e800: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
e810: 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 69 73 54  sMemdb==0 && isT
e820: 65 6d 70 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  empDb==0 ){.    
e830: 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
e840: 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
e850: 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
e860: 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
e870: 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
e880: 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
e890: 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
e8a0: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
e8b0: 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  c(nFullPathname)
e8c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e8d0: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
e8e0: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  ed;.      p->sha
e8f0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
e900: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
e910: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
e920: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
e930: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e940: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e950: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e960: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e970: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
e980: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
e990: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e9a0: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
e9b0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e9c0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e9d0: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
e9e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e9f0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
ea00: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
ea10: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
ea20: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ea30: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
ea40: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
ea50: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ea60: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
ea70: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
ea80: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
ea90: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
eaa0: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
eab0: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
eac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
ead0: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
eae0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
eaf0: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
eb00: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
eb10: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
eb20: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
eb30: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
eb40: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
eb50: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
eb60: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
eb70: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
eb80: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
eb90: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
ebb0: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
ebc0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
ebd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
ebe0: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
ebf0: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
ec00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ec10: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ec20: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
ec30: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
ec40: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
ec50: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
ec60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ec70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
ec80: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
eca0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
ecb0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
ecc0: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
ecd0: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
ece0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
ecf0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
ed00: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
ed10: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
ed20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ed30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ed40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ed50: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
ed60: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
ed70: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
ed80: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ed90: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
eda0: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
edb0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
edc0: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
edd0: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
ede0: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
edf0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
ee00: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
ee10: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
ee20: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
ee30: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
ee40: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
ee50: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
ee60: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
ee70: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
ee80: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
ee90: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
eea0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
eeb0: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
eec0: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
eed0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
eee0: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
eef0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
ef00: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
ef10: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
ef20: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
ef30: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
ef40: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
ef50: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
ef60: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
ef70: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
ef80: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
ef90: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
efa0: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
efb0: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
efc0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
efd0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
efe0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
eff0: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
f000: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
f010: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
f020: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
f030: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
f040: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
f050: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
f060: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
f070: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
f080: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
f090: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
f0a0: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
f0b0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
f0c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
f0d0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
f0e0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
f0f0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
f100: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
f110: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
f120: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
f130: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
f160: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
f170: 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
f180: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f190: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
f1a0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
f1b0: 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
f1c0: 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
f1d0: 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
f1e0: 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
f1f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f200: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
f210: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
f220: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
f230: 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
f240: 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
f250: 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
f260: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
f270: 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
f280: 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
f290: 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
f2a0: 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
f2b0: 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
f2c0: 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
f2d0: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
f2e0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61   0;.    pBt->rea
f2f0: 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50  dOnly = sqlite3P
f300: 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
f310: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 23 69 66  Bt->pPager);.#if
f320: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
f330: 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
f340: 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
f350: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70   1;.#endif.    p
f360: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
f370: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
f380: 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
f390: 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
f3a0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
f3b0: 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
f3c0: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
f3d0: 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
f3e0: 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
f3f0: 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
f400: 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
f410: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
f420: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
f430: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
f440: 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
f450: 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
f460: 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
f470: 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
f480: 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
f490: 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
f4a0: 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
f4b0: 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
f4c0: 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
f4d0: 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
f4e0: 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
f4f0: 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
f500: 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
f510: 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
f520: 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
f530: 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
f540: 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
f550: 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
f560: 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
f570: 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
f580: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
f590: 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
f5a0: 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
f5b0: 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
f5c0: 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
f5d0: 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
f5e0: 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
f5f0: 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
f600: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
f610: 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
f620: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
f630: 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
f640: 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
f650: 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
f660: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
f670: 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
f680: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
f690: 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
f6a0: 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
f6b0: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
f6c0: 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
f6d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f6e0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
f6f0: 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
f700: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
f710: 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
f720: 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
f730: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
f740: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
f750: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
f760: 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
f770: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
f780: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
f790: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
f7a0: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
f7b0: 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
f7c0: 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
f7d0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
f7e0: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
f7f0: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
f800: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
f810: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
f820: 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
f830: 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
f840: 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
f850: 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
f860: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
f870: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f880: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
f890: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
f8a0: 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
f8b0: 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
f8c0: 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
f8d0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
f8e0: 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
f8f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f900: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
f910: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f920: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
f930: 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20        pBt->nRef 
f940: 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  = 1;.      mutex
f950: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
f960: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
f970: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
f980: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66  ASTER);.      if
f990: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
f9a0: 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
f9b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
f9c0: 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
f9d0: 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
f9e0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
f9f0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
fa00: 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
fa10: 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
fa20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
fa30: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
fa40: 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c          db->mall
fa50: 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20  ocFailed = 0;.  
fa60: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
fa70: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
fa80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
fa90: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
faa0: 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
fab0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
fac0: 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
fad0: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
fae0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
faf0: 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
fb00: 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
fb10: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
fb20: 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
fb30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
fb40: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
fb50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
fb60: 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
fb70: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
fb80: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
fb90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
fba0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
fbb0: 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
fbc0: 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
fbd0: 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
fbe0: 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
fbf0: 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
fc00: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
fc10: 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
fc20: 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
fc30: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
fc40: 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
fc50: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
fc60: 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
fc70: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
fc80: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
fc90: 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
fca0: 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
fcb0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
fcc0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
fcd0: 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
fce0: 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
fcf0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
fd00: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
fd10: 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
fd20: 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
fd30: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
fd40: 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29  >pBt<pSib->pBt )
fd50: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  {.          p->p
fd60: 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20  Next = pSib;.   
fd70: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
fd80: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
fd90: 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  Sib->pPrev = p;.
fda0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fdb0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
fdc0: 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70  pSib->pNext && p
fdd0: 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c  Sib->pNext->pBt<
fde0: 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
fdf0: 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
fe00: 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
fe10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
fe20: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
fe30: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
fe40: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
fe50: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
fe60: 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
fe70: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
fe80: 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
fe90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fea0: 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
feb0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
fec0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
fed0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
fee0: 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
fef0: 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
ff00: 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
ff10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
ff20: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
ff30: 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
ff40: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
ff50: 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
ff60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
ff70: 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
ff80: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
ff90: 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
ffa0: 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
ffb0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d      /* If the B-
ffc0: 54 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73  Tree was success
ffd0: 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65  fully opened, se
ffe0: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
fff0: 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20  e size to the.  
10000 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c    ** default val
10010 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e  ue. Except, when
10020 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65   opening on an e
10030 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
10040 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20  ager-cache,.    
10050 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65  ** do not change
10060 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
10070 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
10080 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
10090 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30  eeSchema(p, 0, 0
100a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
100b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
100c0 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70  hesize(p->pBt->p
100d0 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
100e0 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
100f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
10100 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a  f( mutexOpen ){.
10110 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10120 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d  te3_mutex_held(m
10130 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20  utexOpen) );.   
10140 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
10150 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
10160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65  ;.}../*.** Decre
10180 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65  ment the BtShare
10190 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20  d.nRef counter. 
101a0 20 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73   When it reaches
101b0 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65   zero,.** remove
101c0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
101d0 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65  ructure from the
101e0 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20   sharing list.  
101f0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
10200 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e  f the BtShared.n
10210 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63  Ref counter reac
10220 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74  hes zero and ret
10230 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20  urn.** false if 
10240 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69  it is still posi
10250 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tive..*/.static 
10260 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68  int removeFromSh
10270 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72  aringList(BtShar
10280 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65  ed *pBt){.#ifnde
10290 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
102a0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c  ARED_CACHE.  sql
102b0 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
102c0 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ter;.  BtShared 
102d0 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65  *pList;.  int re
102e0 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73  moved = 0;..  as
102f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10300 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d  tex_notheld(pBt-
10310 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61  >mutex) );.  pMa
10320 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75  ster = sqlite3Mu
10330 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
10340 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
10350 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TER);.  sqlite3_
10360 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
10370 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
10380 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
10390 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
103a0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
103b0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
103c0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
103d0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
103e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
103f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10400 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
10410 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
10420 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
10430 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
10440 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
10450 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
10460 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
10470 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
10480 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
10490 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
104a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
104b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
104c0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
104d0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
104e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
104f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
10500 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10510 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10520 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
10530 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
10540 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
10550 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
10560 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
10570 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
10580 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
10590 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
105a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
105b0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
105c0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
105d0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
105e0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
105f0 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
10600 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
10610 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
10620 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
10630 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
10640 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
10650 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
10660 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d  PageMalloc( pBt-
10670 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d  >pageSize );.  }
10680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
10690 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
106a0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
106b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
106c0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
106d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69  ed *pBt){.  sqli
106e0 74 65 33 50 61 67 65 46 72 65 65 28 20 70 42 74  te3PageFree( pBt
106f0 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
10700 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
10710 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f   0;.}../*.** Clo
10720 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
10730 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
10740 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
10750 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10760 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
10770 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
10780 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10790 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
107a0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
107b0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
107c0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
107d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
107e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
107f0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10800 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10810 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
10820 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
10830 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
10840 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
10850 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
10860 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
10870 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
10880 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
10890 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
108a0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
108b0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
108c0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
108d0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
108e0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
108f0 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
10900 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
10910 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
10920 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
10930 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
10940 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
10950 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
10960 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
10970 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
10980 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10990 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
109a0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
109b0 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
109c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
109d0 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
109e0 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
109f0 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
10a00 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
10a10 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
10a20 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
10a30 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
10a40 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
10a50 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
10a60 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
10a70 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
10a80 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
10a90 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
10aa0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
10ab0 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
10ac0 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
10ad0 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
10ae0 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
10af0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10b00 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
10b10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
10b20 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
10b30 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
10b40 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
10b50 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
10b60 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
10b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
10b80 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
10b90 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
10ba0 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
10bb0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
10bc0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
10bd0 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
10be0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
10bf0 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
10c00 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
10c10 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
10c20 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10c30 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
10c40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10c50 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
10c60 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
10c70 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
10c80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
10c90 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
10ca0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
10cb0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
10cc0 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
10cd0 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
10ce0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
10cf0 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
10d00 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
10d10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10d20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
10d30 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
10d40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
10d50 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
10d60 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
10d70 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
10d80 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
10d90 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
10da0 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
10db0 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
10dc0 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
10dd0 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
10de0 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
10df0 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
10e00 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
10e10 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
10e20 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
10e30 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
10e40 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
10e50 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
10e60 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
10e70 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
10e80 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
10e90 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
10ea0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
10eb0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
10ec0 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
10ed0 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
10ee0 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
10ef0 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
10f00 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
10f10 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
10f20 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
10f30 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
10f40 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
10f50 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
10f60 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
10f70 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
10f80 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
10f90 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
10fa0 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
10fb0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
10fc0 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
10fd0 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
10fe0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10ff0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
11000 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
11010 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
11020 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
11030 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11040 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
11050 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11060 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11070 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11080 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
11090 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
110a0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
110b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
110c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
110d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
110e0 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
110f0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
11100 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
11110 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
11120 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
11130 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
11140 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
11150 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
11160 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
11170 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
11180 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
11190 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
111a0 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
111b0 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
111c0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
111d0 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
111e0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
111f0 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
11200 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
11210 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
11220 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
11230 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
11240 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
11250 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
11260 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
11270 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
11280 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
11290 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
112a0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
112b0 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
112c0 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
112d0 65 6c 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  el(.  Btree *p, 
112e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112f0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
11300 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
11310 6c 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  l on */.  int le
11320 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
11330 20 2f 2a 20 50 52 41 47 4d 41 20 73 79 6e 63 68   /* PRAGMA synch
11340 72 6f 6e 6f 75 73 2e 20 20 31 3d 4f 46 46 2c 20  ronous.  1=OFF, 
11350 32 3d 4e 4f 52 4d 41 4c 2c 20 33 3d 46 55 4c 4c  2=NORMAL, 3=FULL
11360 20 2a 2f 0a 20 20 69 6e 74 20 66 75 6c 6c 53 79   */.  int fullSy
11370 6e 63 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nc,          /* 
11380 50 52 41 47 4d 41 20 66 75 6c 6c 66 73 79 6e 63  PRAGMA fullfsync
11390 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 6b 70 74 46  . */.  int ckptF
113a0 75 6c 6c 53 79 6e 63 20 20 20 20 20 20 20 2f 2a  ullSync       /*
113b0 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
113c0 6e 74 5f 66 75 6c 6c 66 79 6e 63 20 2a 2f 0a 29  nt_fullfync */.)
113d0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
113e0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
113f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11400 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
11410 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11420 72 74 28 20 6c 65 76 65 6c 3e 3d 31 20 26 26 20  rt( level>=1 && 
11430 6c 65 76 65 6c 3c 3d 33 20 29 3b 0a 20 20 73 71  level<=3 );.  sq
11440 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11450 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
11460 65 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c  erSetSafetyLevel
11470 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65  (pBt->pPager, le
11480 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 2c 20 63  vel, fullSync, c
11490 6b 70 74 46 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  kptFullSync);.  
114a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
114b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
114c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
114d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
114e0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
114f0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
11500 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
11510 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
11520 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
11530 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
11540 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
11550 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
11560 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
11570 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
11580 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
11590 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
115a0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
115b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
115c0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
115d0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
115e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
115f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
11600 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
11610 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11620 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
11630 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
11640 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11650 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11660 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11670 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
11680 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
11690 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
116a0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
116b0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
116c0 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
116d0 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
116e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
116f0 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
11700 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
11710 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
11720 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
11730 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
11740 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
11750 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
11760 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
11770 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
11780 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
11790 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
117a0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
117b0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
117c0 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
117d0 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
117e0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
117f0 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
11800 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
11810 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
11820 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
11830 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
11840 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
11850 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
11860 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
11870 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
11880 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
11890 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
118a0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
118b0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
118c0 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
118d0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
118e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
118f0 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
11900 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
11910 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
11920 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
11930 65 6e 20 74 68 65 20 70 61 67 65 53 69 7a 65 46  en the pageSizeF
11940 69 78 65 64 20 66 6c 61 67 20 69 73 20 73 65 74  ixed flag is set
11950 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
11960 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
11970 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
11980 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
11990 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
119a0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
119b0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
119c0 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
119d0 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
119e0 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
119f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
11a00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11a10 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
11a20 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
11a30 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
11a40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
11a50 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
11a60 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
11a70 78 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  xed ){.    sqlit
11a80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11a90 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11aa0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
11ab0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
11ac0 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
11ad0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
11ae0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
11af0 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
11b00 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
11b10 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
11b20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
11b30 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
11b40 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
11b50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
11b60 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
11b70 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
11b80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
11b90 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
11ba0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
11bb0 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
11bc0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
11bd0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
11be0 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
11bf0 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
11c00 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
11c10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
11c20 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
11c30 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
11c40 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
11c50 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
11c60 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
11c70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
11c80 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
11c90 46 69 78 20 29 20 70 42 74 2d 3e 70 61 67 65 53  Fix ) pBt->pageS
11ca0 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 20 20  izeFixed = 1;.  
11cb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11cc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
11cd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
11ce0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
11cf0 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
11d00 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
11d10 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
11d20 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
11d30 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
11d40 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 20 21  geSize;.}..#if !
11d50 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11d60 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
11d70 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  S) || !defined(S
11d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
11d90 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  M)./*.** Return 
11da0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
11db0 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20  tes of space at 
11dc0 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
11dd0 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72   page that.** ar
11de0 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65  e intentually le
11df0 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73  ft unused.  This
11e00 20 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65   is the "reserve
11e10 64 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73  d" space that is
11e20 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73  .** sometimes us
11e30 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73  ed by extensions
11e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11e50 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28  BtreeGetReserve(
11e60 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
11e70 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
11e80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
11e90 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
11ea0 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
11eb0 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74  bleSize;.  sqlit
11ec0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
11ed0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
11ee0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
11ef0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
11f00 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
11f10 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
11f20 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
11f30 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
11f40 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
11f50 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
11f60 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
11f70 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
11f80 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
11f90 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
11fa0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
11fb0 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
11fc0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
11fd0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
11fe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11ff0 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
12000 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
12010 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
12020 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
12030 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12040 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
12050 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  n;.}../*.** Set 
12060 74 68 65 20 73 65 63 75 72 65 44 65 6c 65 74 65  the secureDelete
12070 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67   flag if newFlag
12080 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20   is 0 or 1.  If 
12090 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a  newFlag is -1,.*
120a0 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63  * then make no c
120b0 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20  hanges.  Always 
120c0 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  return the value
120d0 20 6f 66 20 74 68 65 20 73 65 63 75 72 65 44 65   of the secureDe
120e0 6c 65 74 65 0a 2a 2a 20 73 65 74 74 69 6e 67 20  lete.** setting 
120f0 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
12100 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12110 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
12120 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
12130 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
12140 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
12150 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
12160 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12170 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
12180 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
12190 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d  ->secureDelete =
121a0 20 28 6e 65 77 46 6c 61 67 21 3d 30 29 20 3f 20   (newFlag!=0) ? 
121b0 31 20 3a 20 30 3b 0a 20 20 7d 20 0a 20 20 62 20  1 : 0;.  } .  b 
121c0 3d 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65  = p->pBt->secure
121d0 44 65 6c 65 74 65 3b 0a 20 20 73 71 6c 69 74 65  Delete;.  sqlite
121e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
121f0 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65    return b;.}.#e
12200 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
12210 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
12220 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
12230 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12240 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a  MIT_VACUUM) */..
12250 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
12260 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
12270 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
12280 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
12290 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
122a0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
122b0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
122c0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
122d0 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
122e0 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
122f0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
12300 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
12310 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
12320 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
12330 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
12340 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
12350 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
12360 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12370 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
12380 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
12390 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
123a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
123b0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
123c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
123d0 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
123e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
123f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12400 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
12410 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
12420 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12430 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
12440 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12450 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a 30 29  xed && (av ?1:0)
12460 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
12470 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
12480 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
12490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
124a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
124b0 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
124c0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
124d0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
124e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
124f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
12500 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
12510 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
12520 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
12530 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12540 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
12550 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
12560 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
12570 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
12580 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
12590 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
125a0 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
125b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
125c0 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
125d0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
125e0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
125f0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
12600 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
12610 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
12620 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12630 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
12640 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
12650 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
12660 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
12670 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
12680 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
12690 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
126a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
126b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
126c0 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  dif.}.../*.** Ge
126d0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
126e0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
126f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
12700 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
12710 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
12720 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
12730 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
12740 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
12750 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
12760 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
12770 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
12780 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
12790 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
127a0 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
127b0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
127c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
127d0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
127e0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
127f0 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
12800 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
12810 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
12820 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
12830 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
12840 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
12850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12860 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
12870 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
12880 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
12890 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
128a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
128b0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  file */.  int nP
128c0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
128d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
128e0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
128f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
12900 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
12910 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
12920 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
12930 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ile */.  int nPa
12940 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
12950 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
12960 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
12970 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
12980 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
12990 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
129a0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
129b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
129c0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
129d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
129e0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
129f0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
12a00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
12a20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
12a30 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
12a40 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
12a50 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
12a60 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
12a70 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
12a80 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
12a90 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
12aa0 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
12ab0 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
12ac0 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
12ad0 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
12ae0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
12af0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
12b00 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
12b10 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
12b20 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69  pPager, &nPageFi
12b30 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65  le);.  if( nPage
12b40 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34  ==0 || memcmp(24
12b50 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12b60 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61  ata, 92+(u8*)pPa
12b70 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30  ge1->aData,4)!=0
12b80 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
12b90 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20  nPageFile;.  }. 
12ba0 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a   if( nPage>0 ){.
12bb0 20 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65      u32 pageSize
12bc0 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65  ;.    u32 usable
12bd0 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61  Size;.    u8 *pa
12be0 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44  ge1 = pPage1->aD
12bf0 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ata;.    rc = SQ
12c00 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
12c10 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
12c20 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
12c30 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
12c40 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12c50 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12c60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
12c70 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
12c80 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
12c90 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12ca0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12cb0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
12cc0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12cd0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12ce0 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
12cf0 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
12d00 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  2 ){.      pBt->
12d10 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
12d20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
12d30 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20  1[19]>2 ){.     
12d40 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
12d50 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
12d60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72      /* If the wr
12d70 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73  ite version is s
12d80 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61  et to 2, this da
12d90 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
12da0 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a   accessed.    **
12db0 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66   in WAL mode. If
12dc0 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20   the log is not 
12dd0 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70  already open, op
12de0 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20  en it now. Then 
12df0 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  .    ** return S
12e00 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74  QLITE_OK and ret
12e10 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75  urn without popu
12e20 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e  lating BtShared.
12e30 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54  pPage1..    ** T
12e40 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74  he caller detect
12e50 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73  s this and calls
12e60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
12e70 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20  gain. This is.  
12e80 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73    ** required as
12e90 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20   the version of 
12ea0 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79  page 1 currently
12eb0 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75   in the page1 bu
12ec0 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ffer.    ** may 
12ed0 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73  not be the lates
12ee0 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72  t version - ther
12ef0 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72  e may be a newer
12f00 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a   one in the log.
12f10 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
12f20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65   */.    if( page
12f30 31 5b 31 39 5d 3d 3d 32 20 26 26 20 70 42 74 2d  1[19]==2 && pBt-
12f40 3e 64 6f 4e 6f 74 55 73 65 57 41 4c 3d 3d 30 20  >doNotUseWAL==0 
12f50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4f  ){.      int isO
12f60 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  pen = 0;.      r
12f70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12f80 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61  OpenWal(pBt->pPa
12f90 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20  ger, &isOpen);. 
12fa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12fb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12fc0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
12fd0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
12fe0 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
12ff0 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ==0 ){.#ifdef SQ
13000 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
13010 5f 53 41 46 45 54 59 4c 45 56 45 4c 0a 20 20 20  _SAFETYLEVEL.   
13020 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
13030 74 6f 20 73 70 65 63 69 66 69 65 64 20 73 61 66  to specified saf
13040 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 57 41  ety_level for WA
13050 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  L mode */.      
13060 20 20 69 66 28 20 70 42 74 2d 3e 64 62 21 3d 30    if( pBt->db!=0
13070 20 26 26 20 70 42 74 2d 3e 64 62 2d 3e 61 44 62   && pBt->db->aDb
13080 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
13090 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20   int iDb;.      
130a0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
130b0 3d 20 70 42 74 2d 3e 64 62 3b 0a 20 20 20 20 20  = pBt->db;.     
130c0 20 20 20 20 20 44 62 20 2a 61 44 62 20 3d 20 64       Db *aDb = d
130d0 62 2d 3e 61 44 62 3b 0a 20 20 20 20 20 20 20 20  b->aDb;.        
130e0 20 20 75 38 20 6c 65 76 65 6c 20 3d 20 30 3b 0a    u8 level = 0;.
130f0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
13100 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  b=0; iDb<db->nDb
13110 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  ; iDb++){.      
13120 20 20 20 20 20 20 69 66 28 20 61 44 62 5b 69 44        if( aDb[iD
13130 62 5d 2e 70 42 74 20 26 26 20 61 44 62 5b 69 44  b].pBt && aDb[iD
13140 62 5d 2e 70 42 74 2d 3e 70 42 74 3d 3d 70 42 74  b].pBt->pBt==pBt
13150 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
13160 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13170 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
13180 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nDb );.         
13190 20 6c 65 76 65 6c 20 3d 20 64 62 2d 3e 61 44 62   level = db->aDb
131a0 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c 65 76  [iDb].safety_lev
131b0 65 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  el;.          if
131c0 28 20 21 53 51 4c 49 54 45 5f 44 62 53 61 66 65  ( !SQLITE_DbSafe
131d0 74 79 4c 65 76 65 6c 49 73 46 69 78 65 64 28 6c  tyLevelIsFixed(l
131e0 65 76 65 6c 29 20 26 26 20 0a 20 20 20 20 20 20  evel) && .      
131f0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44         (SQLITE_D
13200 62 53 61 66 65 74 79 4c 65 76 65 6c 56 61 6c 75  bSafetyLevelValu
13210 65 28 6c 65 76 65 6c 29 20 21 3d 20 53 51 4c 49  e(level) != SQLI
13220 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
13230 41 46 45 54 59 4c 45 56 45 4c 29 20 29 7b 0a 20  AFETYLEVEL) ){. 
13240 20 20 20 20 20 20 20 20 20 20 20 61 44 62 5b 69             aDb[i
13250 44 62 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db].safety_level
13260 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
13270 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45  T_WAL_SAFETYLEVE
13280 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  L;.            s
13290 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
132a0 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
132b0 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45  Pager, SQLITE_DE
132c0 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59  FAULT_WAL_SAFETY
132d0 4c 45 56 45 4c 2c 20 0a 20 20 20 20 20 20 20 20  LEVEL, .        
132e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
13300 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
13310 5f 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30 2c 0a  _FullFSync)!=0,.
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13340 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67         (db->flag
13350 73 26 53 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c  s&SQLITE_CkptFul
13360 6c 46 53 79 6e 63 29 21 3d 30 29 3b 0a 20 20 20  lFSync)!=0);.   
13370 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13380 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13390 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
133a0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 72  age1);.        r
133b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
133c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
133d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
133e0 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  B;.    }.#endif.
133f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69  .    /* The maxi
13400 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61  mum embedded fra
13410 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78  ction must be ex
13420 61 63 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20  actly 25%.  And 
13430 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20  the minimum.    
13440 2a 2a 20 65 6d 62 65 64 64 65 64 20 66 72 61 63  ** embedded frac
13450 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e  tion must be 12.
13460 35 25 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66  5% for both leaf
13470 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65  -data and non-le
13480 61 66 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20  af-data..    ** 
13490 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
134a0 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
134b0 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
134c0 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
134d0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
134e0 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
134f0 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
13500 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
13510 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
13520 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
13530 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
13540 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
13550 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
13560 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
13570 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
13580 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
13590 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
135a0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
135b0 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69  0.     || pageSi
135c0 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
135d0 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c  GE_SIZE .     ||
135e0 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a   pageSize<=256 .
135f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
13600 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13610 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  led;.    }.    a
13620 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
13630 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
13640 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
13650 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
13660 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
13670 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
13680 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
13690 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
136a0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
136b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
136c0 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
136d0 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
136e0 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
136f0 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
13700 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
13710 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
13720 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
13730 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
13740 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
13750 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
13760 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
13770 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
13780 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
13790 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
137a0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
137b0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
137c0 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
137d0 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
137e0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
137f0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
13800 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
13810 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
13820 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
13830 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
13840 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
13850 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
13860 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
13870 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
13880 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
13890 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
138c0 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
138d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
138e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
138f0 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
13900 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
13910 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
13920 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
13930 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13940 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
13950 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13960 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13970 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
13980 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20  leSize<480 ){.  
13990 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
139a0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
139b0 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
139c0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
139d0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
139e0 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
139f0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13a00 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13a10 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
13a20 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
13a30 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
13a40 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
13a50 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
13a60 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
13a70 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
13a80 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
13a90 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
13aa0 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
13ab0 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
13ac0 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
13ad0 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
13ae0 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
13af0 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
13b00 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
13b10 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
13b20 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
13b30 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
13b40 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
13b50 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
13b60 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
13b70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
13b80 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
13b90 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
13ba0 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
13bb0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
13bc0 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
13bd0 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
13be0 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
13bf0 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
13c00 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
13c10 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
13c20 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
13c30 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
13c40 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
13c50 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65  pointer, a heade
13c60 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75  r which is as mu
13c70 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79  ch as.  ** 17 by
13c80 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e  tes long, 0 to N
13c90 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
13ca0 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e  d, and an option
13cb0 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c  al 4 byte overfl
13cc0 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69  ow.  ** page poi
13cd0 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74  nter..  */.  pBt
13ce0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31  ->maxLocal = (u1
13cf0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
13d00 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
13d10 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e   23);.  pBt->min
13d20 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
13d30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
13d40 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
13d50 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  .  pBt->maxLeaf 
13d60 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
13d70 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20  bleSize - 35);. 
13d80 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
13d90 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
13da0 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
13db0 35 20 2d 20 32 33 29 3b 0a 20 20 61 73 73 65 72  5 - 23);.  asser
13dc0 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20  t( pBt->maxLeaf 
13dd0 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f  + 23 <= MX_CELL_
13de0 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70  SIZE(pBt) );.  p
13df0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61  Bt->pPage1 = pPa
13e00 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ge1;.  pBt->nPag
13e10 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74  e = nPage;.  ret
13e20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
13e30 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13e40 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
13e50 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
13e60 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
13e70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13e80 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
13e90 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
13ea0 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
13eb0 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
13ec0 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
13ed0 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
13ee0 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
13ef0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13f00 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
13f10 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
13f20 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
13f30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13f40 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
13f50 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
13f60 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
13f70 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
13f80 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
13f90 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
13fa0 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
13fb0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
13fc0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
13fd0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
13fe0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
13ff0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
14000 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
14010 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
14020 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73  sert( pBt->pCurs
14030 6f 72 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  or==0 || pBt->in
14040 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
14050 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
14060 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14070 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
14080 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
14090 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
140a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
140b0 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
140c0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
140d0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
140e0 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73  er)==1 );.    as
140f0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
14100 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
14110 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d  releasePage(pBt-
14120 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70 42  >pPage1);.    pB
14130 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
14140 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
14150 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
14160 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
14170 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
14180 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
14190 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
141a0 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
141b0 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
141c0 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
141d0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
141e0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
141f0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
14200 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
14210 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
14220 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
14230 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
14240 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
14250 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
14260 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
14270 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
14280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
14290 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
142a0 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
142b0 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
142c0 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
142d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
142e0 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
142f0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
14300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
14310 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
14320 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
14330 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
14340 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
14350 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
14360 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d  16 );.  data[16]
14370 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
14380 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29  geSize>>8)&0xff)
14390 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28  ;.  data[17] = (
143a0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
143b0 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20  ze>>16)&0xff);. 
143c0 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
143d0 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
143e0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
143f0 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
14400 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
14410 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
14420 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
14430 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
14440 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
14450 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
14460 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
14470 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
14480 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
14490 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
144a0 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
144b0 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
144c0 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
144d0 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
144e0 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
144f0 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
14500 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
14510 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
14520 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
14530 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
14540 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
14550 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
14560 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
14570 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
14580 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
14590 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
145a0 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
145b0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
145c0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
145d0 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
145e0 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
145f0 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  if.  pBt->nPage 
14600 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20  = 1;.  data[31] 
14610 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
14620 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14630 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
14640 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
14650 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
14660 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
14670 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
14680 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
14690 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
146a0 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
146b0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
146c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
146d0 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
146e0 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
146f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
14700 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
14710 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
14720 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
14730 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
14740 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
14750 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
14760 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
14770 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
14780 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
14790 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
147a0 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
147b0 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
147c0 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
147d0 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
147e0 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
147f0 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
14800 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
14810 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
14820 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
14830 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
14840 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
14850 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
14860 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
14870 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
14880 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
14890 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
148a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
148b0 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
148c0 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
148d0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
148e0 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
148f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
14900 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
14910 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
14920 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
14930 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
14940 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
14950 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
14960 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
14970 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
14980 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
14990 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
149a0 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
149b0 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
149c0 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
149d0 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
149e0 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
149f0 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
14a00 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
14a10 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
14a20 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
14a30 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
14a40 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
14a50 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
14a60 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
14a70 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
14a80 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
14a90 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
14aa0 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
14ab0 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
14ac0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
14ad0 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
14ae0 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
14af0 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
14b00 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
14b10 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
14b20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
14b30 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
14b40 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
14b50 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
14b60 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
14b70 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
14b80 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
14b90 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
14ba0 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
14bb0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
14bc0 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
14bd0 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
14be0 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
14bf0 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
14c00 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
14c10 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
14c20 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
14c30 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
14c40 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
14c50 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
14c60 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
14c70 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
14c80 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
14c90 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
14ca0 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
14cb0 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
14cc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14cd0 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
14ce0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
14cf0 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
14d00 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
14d10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
14d20 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
14d30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
14d40 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14d50 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
14d60 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
14d70 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
14d80 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
14d90 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
14da0 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
14db0 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
14dc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
14dd0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
14de0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
14df0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
14e00 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
14e10 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
14e20 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
14e30 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
14e40 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
14e50 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
14e60 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
14e70 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
14e80 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
14e90 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
14ea0 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
14eb0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72   */.  if( pBt->r
14ec0 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61  eadOnly && wrfla
14ed0 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  g ){.    rc = SQ
14ee0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
14ef0 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
14f00 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
14f10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
14f20 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20  ARED_CACHE.  /* 
14f30 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62  If another datab
14f40 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  ase handle has a
14f50 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20  lready opened a 
14f60 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
14f70 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20  n .  ** on this 
14f80 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72  shared-btree str
14f90 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63  ucture and a sec
14fa0 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61  ond write transa
14fb0 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65  ction is.  ** re
14fc0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
14fd0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
14fe0 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61   */.  if( (wrfla
14ff0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
15000 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
15010 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73  RITE) || pBt->is
15020 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70  Pending ){.    p
15030 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
15040 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
15050 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
15060 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
15070 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
15080 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
15090 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
150a0 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
150b0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
150c0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
150d0 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
150e0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
150f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15110 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
15120 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
15130 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
15140 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
15150 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
15160 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
15170 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
15180 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
15190 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
151a0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
151b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
151c0 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
151d0 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
151e0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
151f0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
15200 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
15210 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
15220 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
15230 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
15240 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
15250 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
15260 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
15270 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
15280 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
15290 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
152a0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
152b0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
152c0 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70  Bt->initiallyEmp
152d0 74 79 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 6e  ty = (u8)(pBt->n
152e0 50 61 67 65 3d 3d 30 29 3b 0a 20 20 64 6f 20 7b  Page==0);.  do {
152f0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
15300 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
15310 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
15320 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
15330 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
15340 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
15350 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
15360 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
15370 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
15380 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
15390 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
153a0 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
153b0 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
153c0 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
153d0 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
153e0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
153f0 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
15400 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
15410 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
15420 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
15430 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
15440 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
15450 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
15460 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
15470 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
15480 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
15490 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
154a0 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
154b0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
154c0 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
154d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
154e0 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
154f0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
15500 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
15510 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15520 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
15530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15540 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
15550 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
15560 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69  er,wrflag>1,sqli
15570 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
15580 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
15590 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
155a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
155b0 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
155c0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  (pBt);.        }
155d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
155e0 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51   .    if( rc!=SQ
155f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15600 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
15610 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d  used(pBt);.    }
15620 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30  .  }while( (rc&0
15630 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  xFF)==SQLITE_BUS
15640 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
15650 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
15660 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
15670 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
15680 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
15690 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
156a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
156b0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
156c0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
156d0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
156e0 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
156f0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15700 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
15710 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 09  p->sharable ){..
15720 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
15730 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
15740 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
15750 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
15760 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
15770 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
15780 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
15790 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
157a0 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
157b0 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
157c0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
157d0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
157e0 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
157f0 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
15800 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
15810 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
15820 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
15830 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15840 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
15850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
15860 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d  lag ){.      Mem
15870 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
15880 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e  Bt->pPage1;.#ifn
15890 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
158a0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
158b0 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
158c0 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
158d0 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
158e0 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   p;.      pBt->i
158f0 73 45 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38  sExclusive = (u8
15900 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a 23 65 6e  )(wrflag>1);.#en
15910 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
15920 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
15930 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
15940 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
15950 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
15960 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
15970 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
15980 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15990 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
159a0 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
159b0 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
159c0 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
159d0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
159e0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
159f0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
15a00 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
15a10 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
15a20 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
15a30 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
15a40 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
15a50 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
15a60 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
15a70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15a80 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
15a90 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
15aa0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
15ab0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
15ac0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
15ad0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
15ae0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15b00 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
15b10 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
15b20 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
15b30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15b40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
15b50 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20  .trans_begun:.  
15b60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15b70 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
15b80 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
15b90 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20  makes sure that 
15ba0 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68  the pager has th
15bb0 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
15bc0 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20   of.    ** open 
15bd0 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74  savepoints. If t
15be0 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
15bf0 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ter is greater t
15c00 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a  han 0 and.    **
15c10 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
15c20 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
15c30 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69  open, then it wi
15c40 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72  ll be opened her
15c50 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  e..    */.    rc
15c60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
15c70 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
15c80 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d  ->pPager, p->db-
15c90 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  >nSavepoint);.  
15ca0 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  }..  btreeIntegr
15cb0 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
15cc0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
15cd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15ce0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15cf0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a  MIT_AUTOVACUUM..
15d00 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f  /*.** Set the po
15d10 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
15d20 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72  s for all childr
15d30 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  en of page pPage
15d40 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50  . Also, if.** pP
15d50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c  age contains cel
15d60 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ls that point to
15d70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
15d80 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   set the pointer
15d90 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20  .** map entries 
15da0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
15db0 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a   pages as well..
15dc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
15dd0 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65  tChildPtrmaps(Me
15de0 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
15df0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76      /* Counter v
15e20 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ariable */.  int
15e30 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
15e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
15e60 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65  ls in page pPage
15e70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
15ea0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53  rn code */.  BtS
15eb0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
15ec0 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73  ge->pBt;.  u8 is
15ed0 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
15ee0 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
15ef0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
15f00 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
15f10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15f20 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
15f30 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
15f40 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  btreeInitPage(pP
15f50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
15f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15f70 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
15f80 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d  ptrmaps_out;.  }
15f90 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
15fa0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
15fb0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
15fc0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
15fd0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
15fe0 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
15ff0 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
16000 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
16010 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
16020 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
16030 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
16040 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
16050 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
16060 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
16070 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
16080 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
16090 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
160a0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
160b0 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
160c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
160d0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
160e0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
160f0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
16100 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
16110 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
16120 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74  , &rc);.  }..set
16130 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
16140 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
16150 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
16160 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16170 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
16180 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
16190 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
161a0 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
161b0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
161c0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
161d0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
161e0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
161f0 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
16200 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
16210 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
16220 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
16230 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
16240 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
16250 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
16260 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
16270 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
16280 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
16290 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
162a0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
162b0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
162c0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
162d0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
162e0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16300 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
16310 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
16320 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
16330 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
16340 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
16350 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
16360 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
16370 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
16380 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
16390 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
163a0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
163b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
163c0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
163d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
163e0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
163f0 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
16400 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16410 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
16420 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
16430 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
16440 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
16450 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
16460 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
16470 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16480 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
16490 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
164a0 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
164b0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
164c0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
164d0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
164e0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
164f0 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
16500 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
16510 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16520 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
16530 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
16540 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
16550 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72  .    u8 isInitOr
16560 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
16570 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
16580 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
16590 20 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65     btreeInitPage
165a0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
165b0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
165c0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
165d0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
165e0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
165f0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
16600 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
16610 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
16620 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
16630 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
16640 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
16650 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
16660 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
16670 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
16680 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
16690 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
166a0 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
166b0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
166c0 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  low]) ){.       
166d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
166e0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
166f0 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
16700 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16710 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16720 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16730 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
16740 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
16750 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
16760 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
16770 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
16780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
16790 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
167a0 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
167b0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
167c0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
167d0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
167e0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
167f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
16800 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
16810 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
16820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16830 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
16840 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
16850 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
16860 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
16870 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
16880 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
16890 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
168a0 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
168b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
168c0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
168d0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
168e0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
168f0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
16900 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
16910 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
16920 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
16930 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
16940 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
16950 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
16960 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
16970 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
16980 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
16990 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
169a0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
169b0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
169c0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
169d0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
169e0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
169f0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
16a00 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
16a10 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
16a20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
16a30 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
16a40 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
16a50 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
16a60 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
16a70 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
16a80 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
16a90 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
16aa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16ab0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
16ac0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
16ad0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
16ae0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
16af0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
16b00 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
16b10 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
16b20 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
16b30 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
16b40 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
16b50 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
16b60 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
16b70 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
16b80 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
16b90 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
16ba0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
16bb0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
16bc0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
16bd0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
16be0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
16bf0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
16c00 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
16c10 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
16c20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
16c30 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
16c40 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
16c50 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
16c60 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
16c70 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
16c80 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
16c90 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
16ca0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
16cb0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
16cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16cd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16ce0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
16cf0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
16d00 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
16d10 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
16d20 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
16d30 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
16d40 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
16d50 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
16d60 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
16d70 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
16d80 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
16d90 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
16da0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
16db0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
16dc0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
16dd0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
16de0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
16df0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
16e00 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
16e10 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
16e20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16e30 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
16e40 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
16e50 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
16e60 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
16e70 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
16e80 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
16e90 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
16ea0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
16eb0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
16ec0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
16ed0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
16ee0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
16ef0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
16f00 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
16f10 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
16f20 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
16f30 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
16f40 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
16f50 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
16f60 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
16f70 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
16f80 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
16f90 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
16fa0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
16fb0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
16fc0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
16fd0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
16fe0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
16ff0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
17000 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
17010 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
17020 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
17030 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
17040 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
17050 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
17060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17070 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
17080 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
17090 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
170a0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
170b0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
170c0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
170d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
170e0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
170f0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
17100 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
17110 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
17120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17130 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
17140 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
17150 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
17160 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
17170 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
17180 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
17190 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
171a0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
171b0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
171c0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
171d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
171e0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
171f0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
17200 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
17210 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
17220 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
17230 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
17240 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
17250 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
17270 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
17280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17290 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
172a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
172b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
172c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
172d0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
172e0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
172f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
17300 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
17310 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
17320 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
17330 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
17340 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
17350 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
17360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17370 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
17380 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
17390 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
173a0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
173b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
173c0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
173d0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
173e0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
173f0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
17400 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
17410 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
17420 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
17430 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
17440 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
17450 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
17460 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
17470 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
17480 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
17490 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
174a0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
174b0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
174c0 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
174d0 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
174e0 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
174f0 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
17500 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
17510 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
17520 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
17530 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
17540 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
17550 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
17560 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
17570 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
17580 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
17590 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
175a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
175b0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
175c0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
175d0 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a  nction assumes.*
175e0 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  * that the calle
175f0 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
17600 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
17610 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74  ep() until.** it
17620 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
17630 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72  DONE or an error
17640 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20  , and that nFin 
17650 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
17660 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61   of pages the da
17670 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
17680 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74   contain after t
17690 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20  his .** process 
176a0 69 73 20 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66  is complete.  If
176b0 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69   nFin is zero, i
176c0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
176d0 74 0a 2a 2a 20 69 6e 63 72 56 61 63 75 75 6d 53  t.** incrVacuumS
176e0 74 65 70 28 29 20 77 69 6c 6c 20 62 65 20 63 61  tep() will be ca
176f0 6c 6c 65 64 20 61 20 66 69 6e 69 74 65 20 61 6d  lled a finite am
17700 6f 75 6e 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a  ount of times.**
17710 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
17720 79 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 65 20  y not empty the 
17730 66 72 65 65 6c 69 73 74 2e 20 20 41 20 66 75 6c  freelist.  A ful
17740 6c 20 61 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20  l autovacuum.** 
17750 68 61 73 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22  has nFin>0.  A "
17760 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74  PRAGMA increment
17770 61 6c 5f 76 61 63 75 75 6d 22 20 68 61 73 20 6e  al_vacuum" has n
17780 46 69 6e 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69  Fin==0..*/.stati
17790 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
177a0 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
177b0 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
177c0 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20  gno iLastPg){.  
177d0 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
177e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
177f0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
17800 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
17810 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
17820 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
17830 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17840 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
17850 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
17860 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
17870 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
17880 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
17890 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
178a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
178b0 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
178c0 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
178d0 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
178e0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
178f0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
17900 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
17910 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
17920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17930 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
17940 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
17950 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
17960 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
17970 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
17980 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17990 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
179a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
179b0 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
179c0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
179d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
179e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
179f0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
17a00 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
17a10 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e  {.      if( nFin
17a20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
17a30 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
17a40 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
17a50 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
17a60 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
17a70 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e  .        ** if n
17a80 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  Fin is non-zero.
17a90 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
17aa0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
17ab0 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
17ac0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
17ad0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
17ae0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
17af0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
17b00 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
17b10 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
17b20 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
17b30 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
17b40 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
17b50 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
17b60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
17b70 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
17b80 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
17b90 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
17ba0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
17bb0 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20  astPg, 1);.     
17bc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
17bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
17c00 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d  ssert( iFreePg==
17c10 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
17c20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17c30 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
17c40 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
17c50 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
17c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
17c70 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70   Index of free p
17c80 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73  age to move pLas
17c90 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20  tPg to */.      
17ca0 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67  MemPage *pLastPg
17cb0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ;..      rc = bt
17cc0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
17cd0 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
17ce0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
17cf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17d00 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
17d10 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
17d20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69      /* If nFin i
17d30 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
17d40 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
17d50 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
17d60 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
17d70 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
17d80 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
17d90 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
17da0 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
17db0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
17dc0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
17dd0 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61   if nFin is grea
17de0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
17df0 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
17e00 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
17e10 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
17e20 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
17e30 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
17e40 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
17e50 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
17e60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f       */.      do
17e70 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
17e80 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
17e90 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
17ea0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
17eb0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
17ec0 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ePg, 0, 0);.    
17ed0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17ee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17ef0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
17f00 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
17f10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17f20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17f30 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
17f40 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
17f50 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69  le( nFin!=0 && i
17f60 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
17f70 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
17f80 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
17f90 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
17fa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
17fb0 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62  ite(pLastPg->pDb
17fc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
17fd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17fe0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
17ff0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
18000 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
18010 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
18020 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20  Pg, nFin!=0);.  
18030 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
18040 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
18050 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
18060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18070 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
18080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18090 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30  }..  if( nFin==0
180a0 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d   ){.    iLastPg-
180b0 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  -;.    while( iL
180c0 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
180d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
180e0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
180f0 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
18100 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
18110 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
18120 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  Pg) ){.        M
18130 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20  emPage *pPg;.   
18140 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
18150 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
18160 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  tPg, &pPg, 0);. 
18170 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
18180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18190 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
181a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
181b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
181c0 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
181d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
181e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
181f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18200 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18210 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
18220 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
18230 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61       }.      iLa
18240 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  stPg--;.    }.  
18250 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
18260 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
18270 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67  >pPager, iLastPg
18280 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  );.    pBt->nPag
18290 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d  e = iLastPg;.  }
182a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
182b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
182c0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
182d0 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
182e0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
182f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
18300 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
18310 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
18320 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
18330 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
18340 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
18350 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
18360 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
18370 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
18380 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
18390 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
183a0 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
183b0 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
183c0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
183d0 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  rred,.** SQLITE_
183e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
183f0 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
18400 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
18410 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18420 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
18430 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
18440 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
18450 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
18460 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18470 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
18480 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18490 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
184a0 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
184b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
184c0 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56   if( !pBt->autoV
184d0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
184e0 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
184f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61   }else{.    inva
18500 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
18510 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
18520 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
18530 53 74 65 70 28 70 42 74 2c 20 30 2c 20 62 74 72  Step(pBt, 0, btr
18540 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
18550 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
18560 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18580 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
18590 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
185a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
185b0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
185c0 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
185d0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
185e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
185f0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18600 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
18610 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
18620 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
18630 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
18640 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
18650 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65  on.** is commite
18660 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
18670 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
18680 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
18690 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
186a0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
186b0 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
186c0 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
186d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
186e0 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
186f0 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
18700 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
18710 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
18720 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
18730 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
18740 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
18750 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
18760 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
18770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18780 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
18790 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
187a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
187b0 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
187c0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
187d0 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
187e0 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
187f0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
18800 74 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  t(pPager) );..  
18810 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
18820 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
18830 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
18840 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
18850 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
18860 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
18870 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
18880 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
18890 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
188a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
188b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
188c0 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
188d0 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
188e0 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
188f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18900 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
18910 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
18920 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ly */.    Pgno n
18930 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
18940 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70  Number of PtrMap
18950 20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65   pages to be fre
18960 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ed */.    Pgno i
18970 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
18980 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
18990 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
189a0 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20   int nEntry;    
189b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
189c0 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
189d0 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
189e0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20     Pgno nOrig;  
189f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
18a00 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72  e size before fr
18a10 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f  eeing */..    nO
18a20 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63  rig = btreePagec
18a30 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69  ount(pBt);.    i
18a40 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  f( PTRMAP_ISPAGE
18a50 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20  (pBt, nOrig) || 
18a60 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
18a70 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
18a80 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20  .      /* It is 
18a90 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
18aa0 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73  create a databas
18ab0 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  e for which the 
18ac0 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20  final page.     
18ad0 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20   ** is either a 
18ae0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
18af0 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d   or the pending-
18b00 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e  byte page. If on
18b10 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e  e.      ** is en
18b20 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20  countered, this 
18b30 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70  indicates corrup
18b40 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
18b50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18b60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18b70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65  .    }..    nFre
18b80 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  e = get4byte(&pB
18b90 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
18ba0 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72  [36]);.    nEntr
18bb0 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
18bc0 69 7a 65 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d  ize/5;.    nPtrm
18bd0 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
18be0 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
18bf0 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
18c00 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20  ry)/nEntry;.    
18c10 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e  nFin = nOrig - n
18c20 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a  Free - nPtrmap;.
18c30 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45      if( nOrig>PE
18c40 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
18c50 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e  pBt) && nFin<PEN
18c60 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
18c70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69  Bt) ){.      nFi
18c80 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  n--;.    }.    w
18c90 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
18ca0 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c  AGE(pBt, nFin) |
18cb0 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f  | nFin==PENDING_
18cc0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
18cd0 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
18ce0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46      }.    if( nF
18cf0 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
18d00 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
18d10 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28  _BKPT;..    for(
18d20 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
18d30 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
18d40 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
18d50 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
18d60 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
18d70 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b  t, nFin, iFree);
18d80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
18d90 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
18da0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  || rc==SQLITE_OK
18db0 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a  ) && nFree>0 ){.
18dc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18dd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
18de0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
18df0 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  e);.      put4by
18e00 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
18e10 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
18e20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
18e30 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
18e40 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[36], 0);.    
18e50 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
18e60 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
18e70 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20  8], nFin);.     
18e80 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
18e90 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
18ea0 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20  pPager, nFin);. 
18eb0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
18ec0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20  = nFin;.    }.  
18ed0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18ee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
18ef0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
18f00 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
18f10 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
18f20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67  nRef==sqlite3Pag
18f30 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
18f40 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  r) );.  return r
18f50 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  c;.}..#else /* i
18f60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18f70 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
18f80 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c  # define setChil
18f90 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49  dPtrmaps(x) SQLI
18fa0 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
18fb0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18fc0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
18fd0 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70  phase of a two-p
18fe0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
18ff0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61  is routine.** ca
19000 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20  uses a rollback 
19010 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72  journal to be cr
19020 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65  eated (if it doe
19030 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
19040 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75  ist).** and popu
19050 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67  lated with enoug
19060 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  h information so
19070 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72   that if a power
19080 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20   loss occurs.** 
19090 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
190a0 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20   be restored to 
190b0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
190c0 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61  te by playing ba
190d0 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  ck.** the journa
190e0 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e  l.  Then the con
190f0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75  tents of the jou
19100 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64  rnal are flushed
19110 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64   out to.** the d
19120 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20  isk.  After the 
19130 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c  journal is safel
19140 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20  y on oxide, the 
19150 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a  changes to the.*
19160 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77  * database are w
19170 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
19180 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
19190 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69  d flushed to oxi
191a0 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e  de..** At the en
191b0 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20  d of this call, 
191c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
191d0 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74  rnal still exist
191e0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b  s on the.** disk
191f0 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c   and we are stil
19200 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f  l holding all lo
19210 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e  cks, so the tran
19220 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a  saction has not.
19230 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53  ** committed.  S
19240 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ee sqlite3BtreeC
19250 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
19260 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70  for the second p
19270 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  hase of the.** c
19280 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a  ommit process..*
19290 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69  *.** This call i
192a0 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20  s a no-op if no 
192b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
192c0 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  n is currently a
192d0 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a  ctive on pBt..**
192e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
192f0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
19300 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74   file for the bt
19310 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72  ree pBt. zMaster
19320 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68   points to.** th
19330 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
19340 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
19350 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77  that should be w
19360 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a  ritten into the.
19370 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  ** individual jo
19380 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69  urnal file, or i
19390 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69  s NULL, indicati
193a0 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  ng no master jou
193b0 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73  rnal file .** (s
193c0 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
193d0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
193e0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
193f0 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74  called, the mast
19400 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c  er journal shoul
19410 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  d already have b
19420 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20  een.** created, 
19430 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 74  populated with t
19440 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  his journal poin
19450 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74  ter and synced t
19460 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  o disk..**.** On
19470 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74 69  ce this is routi
19480 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c  ne has returned,
19490 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   the only thing 
194a0 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d  required to comm
194b0 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d  it.** the write-
194c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20  transaction for 
194d0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66 69  this database fi
194e0 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  le is to delete 
194f0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  the journal..*/.
19500 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19510 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42  CommitPhaseOne(B
19520 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tree *p, const c
19530 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20  har *zMaster){. 
19540 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19550 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e  _OK;.  if( p->in
19560 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
19570 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
19580 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
19590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
195a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e  eeEnter(p);.#ifn
195b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
195c0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
195d0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
195e0 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
195f0 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
19600 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  t(pBt);.      if
19610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19620 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
19630 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19640 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19650 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
19660 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
19670 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
19680 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
19690 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
196a0 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
196b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
196c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
196d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
196e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
196f0 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
19700 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
19710 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
19720 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
19730 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
19740 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
19750 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
19760 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
19770 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
19780 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19790 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
197a0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
197b0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20  sMutex(p) );..  
197c0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
197d0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28  tent(pBt);.  if(
197e0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
197f0 53 5f 4e 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d  S_NONE && p->db-
19800 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 31  >activeVdbeCnt>1
19810 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
19820 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
19830 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
19840 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
19850 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
19860 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
19870 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
19880 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
19890 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
198a0 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
198b0 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
198c0 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
198d0 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
198e0 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
198f0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
19900 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
19910 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
19920 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19930 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
19940 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
19950 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
19960 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
19970 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
19980 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
19990 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
199a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
199b0 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
199c0 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
199d0 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
199e0 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
199f0 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
19a00 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
19a10 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
19a20 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
19a30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
19a40 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
19a50 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
19a60 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
19a70 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
19a80 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
19a90 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
19aa0 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
19ab0 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
19ac0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
19ad0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
19ae0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
19af0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
19b00 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
19b10 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
19b20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
19b30 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
19b40 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
19b50 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
19b60 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
19b70 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
19b80 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
19b90 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
19ba0 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
19bb0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
19bc0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
19bd0 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
19be0 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
19bf0 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
19c00 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
19c10 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19c20 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
19c30 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
19c40 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
19c50 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
19c60 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
19c70 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
19c80 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
19c90 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
19ca0 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
19cb0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
19cc0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
19cd0 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
19ce0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
19cf0 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
19d00 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
19d10 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
19d20 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
19d30 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
19d40 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
19d50 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
19d60 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
19d70 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
19d80 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
19d90 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
19da0 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
19db0 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
19dc0 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
19dd0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
19de0 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
19df0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
19e00 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
19e10 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
19e20 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
19e30 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
19e40 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
19e50 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
19e60 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
19e70 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
19e80 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
19e90 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
19ea0 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
19eb0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
19ec0 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
19ed0 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
19ee0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
19ef0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
19f00 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
19f10 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
19f20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
19f30 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
19f40 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
19f50 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
19f60 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
19f70 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
19f80 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
19f90 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
19fa0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
19fb0 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
19fc0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
19fd0 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
19fe0 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
19ff0 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
1a000 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
1a010 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
1a020 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
1a030 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
1a040 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
1a050 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1a060 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
1a070 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
1a080 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
1a090 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
1a0a0 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
1a0b0 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
1a0c0 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
1a0d0 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
1a0e0 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
1a0f0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
1a100 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a110 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
1a120 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1a130 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
1a140 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
1a150 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
1a160 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1a170 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
1a180 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
1a190 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
1a1a0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
1a1b0 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
1a1c0 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
1a1d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a1e0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1a1f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1a200 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
1a210 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
1a220 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
1a230 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
1a240 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
1a250 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
1a260 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1a270 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
1a280 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1a290 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1a2a0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
1a2b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1a2c0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
1a2d0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1a2e0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1a2f0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
1a300 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
1a310 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
1a320 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1a330 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
1a340 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
1a350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a360 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
1a370 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
1a380 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a390 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a3a0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
1a3b0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1a3c0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
1a3d0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
1a3e0 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
1a3f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a400 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a410 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
1a420 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
1a430 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
1a440 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1a450 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
1a460 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1a470 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1a480 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
1a490 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1a4a0 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
1a4b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1a4c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a4d0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1a4e0 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a  eTwo(p, 0);.  }.
1a4f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1a500 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1a510 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1a520 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
1a530 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1a540 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  f write-cursors 
1a550 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e  open on this han
1a560 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72  dle. This is for
1a570 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
1a580 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
1a590 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
1a5a0 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
1a5b0 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
1a5c0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ned..**.** For t
1a5d0 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
1a5e0 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77  his routine, a w
1a5f0 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61  rite-cursor is a
1a600 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
1a610 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
1a620 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
1a630 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65  atabse.  That me
1a640 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77  ans the cursor w
1a650 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79  as.** originally
1a660 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
1a670 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73  ing and the curs
1a680 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69  or has not be di
1a690 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76  sabled.** by hav
1a6a0 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68  ing its state ch
1a6b0 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f  anged to CURSOR_
1a6c0 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  FAULT..*/.static
1a6d0 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43   int countWriteC
1a6e0 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
1a6f0 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
1a700 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
1a710 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
1a720 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
1a730 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
1a740 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1a750 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
1a760 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1a770 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
1a780 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
1a790 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
1a7a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1a7b0 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
1a7c0 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
1a7d0 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
1a7e0 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
1a7f0 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
1a800 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61   on BtShared tha
1a810 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
1a820 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76  rences..**.** Ev
1a830 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72  ery cursor is tr
1a840 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
1a850 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65   cursors that be
1a860 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72  long.** to other
1a870 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1a880 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
1a890 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a  n to be sharing.
1a8a0 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ** the cache wit
1a8b0 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
1a8c0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
1a8d0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
1a8e0 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
1a8f0 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
1a900 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
1a910 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69  ache must be tri
1a920 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65  pped.** to preve
1a930 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79  nt them from try
1a940 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62  ing to use the b
1a950 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  tree after.** th
1a960 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  e rollback.  The
1a970 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
1a980 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65  ve deleted table
1a990 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f  s.** or moved ro
1a9a0 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20  ot pages, so it 
1a9b0 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
1a9c0 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65  t to.** save the
1a9d0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
1a9e0 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f  rsor.  The curso
1a9f0 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76  r must be.** inv
1aa00 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  alidated..*/.voi
1aa10 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d sqlite3BtreeTr
1aa20 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
1aa30 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
1aa40 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75  errCode){.  BtCu
1aa50 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74  rsor *p;.  sqlit
1aa60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
1aa70 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  ree);.  for(p=pB
1aa80 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
1aa90 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1aaa0 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  t){.    int i;. 
1aab0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1aac0 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
1aad0 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
1aae0 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
1aaf0 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65   p->skipNext = e
1ab00 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
1ab10 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
1ab20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
1ab30 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
1ab40 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
1ab50 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
1ab60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1ab70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ab80 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
1ab90 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
1aba0 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
1abb0 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
1abc0 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
1abd0 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
1abe0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
1abf0 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
1ac00 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
1ac10 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
1ac20 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1ac30 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
1ac40 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
1ac50 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
1ac60 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
1ac70 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
1ac80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1ac90 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
1aca0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1acb0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
1acc0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
1acd0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
1ace0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
1acf0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b  lback(Btree *p){
1ad00 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
1ad10 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1ad20 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
1ad30 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
1ad40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1ad50 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
1ad60 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1ad70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1ad80 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1ad90 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51  CHE.  if( rc!=SQ
1ada0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
1adb0 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72  * This is a horr
1adc0 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20  ible situation. 
1add0 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  An IO or malloc(
1ade0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  ) error occurred
1adf0 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
1ae00 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
1ae10 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
1ae20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
1ae30 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
1ae40 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
1ae50 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
1ae60 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
1ae70 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
1ae80 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
1ae90 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
1aea0 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
1aeb0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
1aec0 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
1aed0 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
1aee0 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
1aef0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
1af00 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
1af10 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
1af20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
1af30 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
1af40 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
1af50 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
1af60 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
1af70 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1af80 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
1af90 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a  ors(p, rc);.  }.
1afa0 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e  #endif.  btreeIn
1afb0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
1afc0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1afd0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
1afe0 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
1aff0 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
1b000 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
1b010 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
1b020 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
1b030 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
1b040 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1b050 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
1b060 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
1b070 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b080 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
1b090 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
1b0a0 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
1b0b0 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
1b0c0 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
1b0d0 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
1b0e0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
1b0f0 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
1b100 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
1b110 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
1b120 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
1b130 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
1b140 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
1b150 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
1b160 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
1b170 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
1b180 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
1b190 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
1b1a0 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
1b1b0 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
1b1c0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
1b1d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
1b1e0 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
1b1f0 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
1b200 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
1b210 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1b220 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
1b230 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
1b240 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1b250 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
1b260 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
1b270 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1b280 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
1b290 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  AD;.  }..  btree
1b2a0 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1b2b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1b2c0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1b2d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b2e0 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
1b2f0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
1b300 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1b310 63 74 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65  ction can can be
1b320 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
1b330 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66  independently of
1b340 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
1b350 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20  ction. You must 
1b360 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
1b370 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73  ion .** before s
1b380 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61  tarting a subtra
1b390 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
1b3a0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
1b3b0 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
1b3c0 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d  lly .** if the m
1b3d0 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ain transaction 
1b3e0 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73  commits or rolls
1b3f0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61   back..**.** Sta
1b400 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
1b410 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20  ctions are used 
1b420 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61  around individua
1b430 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  l SQL statements
1b440 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e  .** that are con
1b450 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
1b460 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62  BEGIN...COMMIT b
1b470 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73  lock.  If a cons
1b480 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20  traint.** error 
1b490 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1b4a0 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  e statement, the
1b4b0 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20   effect of that 
1b4c0 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  one statement.**
1b4d0 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62   can be rolled b
1b4e0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1b4f0 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ng to rollback t
1b500 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
1b510 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73  ction..**.** A s
1b520 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61  tatement sub-tra
1b530 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c  nsaction is impl
1b540 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e  emented as an an
1b550 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1b560 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20  t. The.** value 
1b570 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1b580 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1b590 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
1b5a0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
1b5b0 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74  ,.** including t
1b5c0 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73  he new anonymous
1b5d0 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e   savepoint, open
1b5e0 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20   on the B-Tree. 
1b5f0 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a  i.e. if there.**
1b600 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73   are no active s
1b610 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f  avepoints and no
1b620 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1b630 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70  -transactions op
1b640 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e  en,.** iStatemen
1b650 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f  t is 1. This ano
1b660 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
1b670 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64   can be released
1b680 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a   or rolled back.
1b690 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
1b6a0 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
1b6b0 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  nt() function..*
1b6c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b6d0 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65  eeBeginStmt(Btre
1b6e0 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65  e *p, int iState
1b6f0 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ment){.  int rc;
1b700 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b710 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1b720 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
1b740 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1b750 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
1b760 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d  ( pBt->readOnly=
1b770 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b780 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  iStatement>0 );.
1b790 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
1b7a0 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76  ment>p->db->nSav
1b7b0 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65  epoint );.  asse
1b7c0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1b7d0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1b7e0 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74  ITE );.  /* At t
1b7f0 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20  he pager level, 
1b800 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1b810 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76  saction is a sav
1b820 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a  epoint with.  **
1b830 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65   an index greate
1b840 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70  r than all savep
1b850 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78  oints created ex
1b860 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20  plicitly using. 
1b870 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
1b880 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
1b890 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
1b8a0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1b8b0 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76  ny.  ** such sav
1b8c0 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68  epoints while th
1b8d0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
1b8e0 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e  saction savepoin
1b8f0 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a  t is active..  *
1b900 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1b910 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1b920 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1b930 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73  iStatement);.  s
1b940 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1b950 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1b960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  ;.}../*.** The s
1b970 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
1b980 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
1b990 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53   op, is always S
1b9a0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1b9b0 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e  K.** or SAVEPOIN
1b9c0 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20  T_RELEASE. This 
1b9d0 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20  function either 
1b9e0 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c  releases or roll
1b9f0 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61  s back the.** sa
1ba00 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69  vepoint identifi
1ba10 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
1ba20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65  iSavepoint, depe
1ba30 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c  nding on the val
1ba40 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a  ue .** of op..**
1ba50 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53  .** Normally, iS
1ba60 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61  avepoint is grea
1ba70 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1ba80 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76  l to zero. Howev
1ba90 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20  er, if op is.** 
1baa0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1bab0 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f  CK, then iSavepo
1bac0 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  int may also be 
1bad0 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  -1. In this case
1bae0 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74   the .** content
1baf0 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  s of the entire 
1bb00 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20  transaction are 
1bb10 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69  rolled back. Thi
1bb20 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a  s is different.*
1bb30 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20  * from a normal 
1bb40 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
1bb50 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b  back, as no lock
1bb60 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61  s are released a
1bb70 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61  nd the.** transa
1bb80 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70  ction remains op
1bb90 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
1bba0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
1bbb0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f  (Btree *p, int o
1bbc0 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e  p, int iSavepoin
1bbd0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1bbe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1bbf0 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  p && p->inTrans=
1bc00 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
1bc10 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1bc20 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1bc30 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45  assert( op==SAVE
1bc40 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c  POINT_RELEASE ||
1bc50 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1bc60 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61  OLLBACK );.    a
1bc70 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e  ssert( iSavepoin
1bc80 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f  t>=0 || (iSavepo
1bc90 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53  int==-1 && op==S
1bca0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1bcb0 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  K) );.    sqlite
1bcc0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1bcd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1bce0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
1bcf0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
1bd00 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
1bd10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bd20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
1bd30 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20  iSavepoint<0 && 
1bd40 70 42 74 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d  pBt->initiallyEm
1bd50 70 74 79 20 29 20 70 42 74 2d 3e 6e 50 61 67 65  pty ) pBt->nPage
1bd60 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
1bd70 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1bd80 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  );.      pBt->nP
1bd90 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
1bda0 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d  8 + pBt->pPage1-
1bdb0 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20  >aData);..      
1bdc0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1bdd0 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e  size was written
1bde0 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74   into the offset
1bdf0 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65   28 of the heade
1be00 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20  r.      ** when 
1be10 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1be20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b  started, so we k
1be30 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c  now that the val
1be40 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20  ue at offset.   
1be50 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a     ** 28 is nonz
1be60 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ero. */.      as
1be70 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
1be80 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >0 );.    }.    
1be90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1bea0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1beb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bec0 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
1bed0 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
1bee0 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
1bef0 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
1bf00 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64  Table. If a read
1bf10 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20  -only cursor is 
1bf20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73  requested, it is
1bf30 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
1bf40 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65   the caller alre
1bf50 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74  ady has at least
1bf60 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
1bf70 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a  nsaction open.**
1bf80 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1bf90 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77   already. If a w
1bfa0 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72  rite-cursor is r
1bfb0 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a  equested, then.*
1bfc0 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  * the caller is 
1bfd0 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
1bfe0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  an open write tr
1bff0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
1c000 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74   If wrFlag==0, t
1c010 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
1c020 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20  an only be used 
1c030 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20  for reading..** 
1c040 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68  If wrFlag==1, th
1c050 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
1c060 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  n be used for re
1c070 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20  ading or for.** 
1c080 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72  writing if other
1c090 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20   conditions for 
1c0a0 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f  writing are also
1c0b0 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20   met.  These.** 
1c0c0 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f  are the conditio
1c0d0 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65 20  ns that must be 
1c0e0 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  met in order for
1c0f0 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62   writing to.** b
1c100 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a  e allowed:.**.**
1c110 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20   1:  The cursor 
1c120 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
1c130 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
1c140 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  g==1.**.** 2:  O
1c150 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1c160 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
1c170 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
1c180 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
1c190 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
1c1a0 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
1c1b0 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
1c1c0 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
1c1d0 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
1c1e0 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
1c1f0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
1c200 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
1c210 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
1c220 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
1c230 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
1c240 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
1c250 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
1c260 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
1c270 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1c280 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
1c290 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
1c2a0 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
1c2b0 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
1c2c0 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
1c2d0 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
1c2e0 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
1c2f0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1c300 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
1c310 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
1c320 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
1c330 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
1c340 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
1c350 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
1c360 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
1c370 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
1c380 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
1c390 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
1c3a0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
1c3b0 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
1c3c0 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
1c3d0 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
1c3e0 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
1c3f0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
1c400 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
1c410 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
1c420 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1c430 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
1c440 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
1c450 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c470 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
1c480 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
1c4b0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
1c4c0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
1c4d0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4f0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1c500 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1c510 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1c520 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1c530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c540 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
1c550 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1c560 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1c570 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1c580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c590 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
1c5a0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
1c5b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1c5c0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
1c5d0 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
1c5e0 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20  ree handle */.. 
1c5f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1c600 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1c610 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1c620 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
1c630 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  lag==1 );..  /* 
1c640 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1c650 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
1c660 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
1c670 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
1c680 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
1c690 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
1c6a0 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
1c6b0 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
1c6c0 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
1c6d0 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
1c6e0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1c6f0 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
1c700 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
1c710 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
1c720 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
1c730 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
1c740 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
1c750 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
1c760 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29  fo!=0, wrFlag+1)
1c770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
1c780 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52  Flag==0 || !hasR
1c790 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
1c7a0 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a  iTable) );..  /*
1c7b0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
1c7c0 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e   caller has open
1c7d0 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ed the required 
1c7e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
1c7f0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1c800 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
1c810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1c820 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54  lag==0 || p->inT
1c830 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1c840 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1c850 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42  Bt->pPage1 && pB
1c860 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1c870 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
1c880 28 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrFlag && pBt->
1c890 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
1c8a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
1c8b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
1c8c0 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20  f( iTable==1 && 
1c8d0 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
1c8e0 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Bt)==0 ){.    re
1c8f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 4d 50 54  turn SQLITE_EMPT
1c900 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  Y;.  }..  /* Now
1c910 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
1c920 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
1c930 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
1c940 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
1c950 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61    ** variables a
1c960 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73  nd link the curs
1c970 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68  or into the BtSh
1c980 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20  ared list.  */. 
1c990 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
1c9a0 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
1c9b0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
1c9c0 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  -1;.  pCur->pKey
1c9d0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1c9e0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
1c9f0 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
1ca00 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
1ca10 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46  wrFlag = (u8)wrF
1ca20 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
1ca30 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
1ca40 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
1ca50 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
1ca60 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
1ca70 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
1ca80 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
1ca90 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
1caa0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1cab0 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65  D;.  pCur->cache
1cac0 64 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 72 65  dRowid = 0;.  re
1cad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1cae0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
1caf0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
1cb00 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
1cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1cb30 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
1cb40 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb60 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
1cb70 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
1cb80 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
1cb90 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
1cbc0 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
1cbd0 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
1cbe0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc00 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
1cc10 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20   xCompare() */. 
1cc20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cc50 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72  Write new cursor
1cc60 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
1cc70 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1cc80 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1cc90 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
1cca0 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
1ccb0 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
1ccc0 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ur);.  sqlite3Bt
1ccd0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1cce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ccf0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
1cd00 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
1cd10 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
1cd20 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
1cd30 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
1cd40 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
1cd50 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
1cd60 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
1cd70 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
1cd80 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
1cd90 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
1cda0 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
1cdb0 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
1cdc0 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
1cdd0 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
1cde0 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
1cdf0 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
1ce00 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
1ce10 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
1ce20 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
1ce30 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
1ce40 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
1ce50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
1ce60 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
1ce70 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
1ce80 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
1ce90 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
1cea0 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
1ceb0 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
1cec0 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
1ced0 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
1cee0 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
1cef0 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
1cf00 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
1cf10 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
1cf20 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
1cf30 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
1cf40 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
1cf50 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
1cf60 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
1cf70 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
1cf80 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
1cf90 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
1cfa0 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
1cfb0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
1cfc0 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
1cfd0 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
1cfe0 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
1cff0 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
1d000 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  );.}../*.** Set 
1d010 74 68 65 20 63 61 63 68 65 64 20 72 6f 77 69 64  the cached rowid
1d020 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
1d030 63 75 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61  cursor in the sa
1d040 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
1d050 0a 2a 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20  .** as pCur and 
1d060 68 61 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20  having the same 
1d070 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
1d080 20 61 73 20 70 43 75 72 2e 20 20 54 68 65 20 76   as pCur.  The v
1d090 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74  alue is.** set t
1d0a0 6f 20 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20  o iRowid..**.** 
1d0b0 4f 6e 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f  Only positive ro
1d0c0 77 69 64 20 76 61 6c 75 65 73 20 61 72 65 20 63  wid values are c
1d0d0 6f 6e 73 69 64 65 72 65 64 20 76 61 6c 69 64 20  onsidered valid 
1d0e0 66 6f 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a  for this cache..
1d0f0 2a 2a 20 54 68 65 20 63 61 63 68 65 20 69 73 20  ** The cache is 
1d100 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
1d110 65 72 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ero, indicating 
1d120 61 6e 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65  an invalid cache
1d130 2e 0a 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c  ..** A btree wil
1d140 6c 20 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68  l work fine with
1d150 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1d160 65 20 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75  e rowids.  We ju
1d170 73 74 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63  st cannot.** cac
1d180 68 65 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74  he zero or negat
1d190 69 76 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63  ive rowids, whic
1d1a0 68 20 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74  h means tables t
1d1b0 68 61 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a  hat use zero or.
1d1c0 2a 2a 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  ** negative rowi
1d1d0 64 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ds might run a l
1d1e0 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42  ittle slower.  B
1d1f0 75 74 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20  ut in practice, 
1d200 7a 65 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74  zero.** or negat
1d210 69 76 65 20 72 6f 77 69 64 73 20 61 72 65 20 76  ive rowids are v
1d220 65 72 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20  ery uncommon so 
1d230 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20  this should not 
1d240 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f  be a problem..*/
1d250 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
1d260 65 65 53 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeSetCachedRowid
1d270 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1d280 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1d290 52 6f 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73  Rowid){.  BtCurs
1d2a0 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1d2b0 43 75 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  Cur->pBt->pCurso
1d2c0 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
1d2d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67  ){.    if( p->pg
1d2e0 6e 6f 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67  noRoot==pCur->pg
1d2f0 6e 6f 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68  noRoot ) p->cach
1d300 65 64 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64  edRowid = iRowid
1d310 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1d320 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69  pCur->cachedRowi
1d330 64 3d 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a  d==iRowid );.}..
1d340 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1d350 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f   cached rowid fo
1d360 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
1d370 6f 72 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20  or.  A negative 
1d380 6f 72 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72  or zero.** retur
1d390 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1d3a0 73 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64  s that the rowid
1d3b0 20 63 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69   cache is invali
1d3c0 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a  d and should be.
1d3d0 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20  ** ignored.  If 
1d3e0 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1d3f0 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
1d400 20 62 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20   been set, then 
1d410 61 0a 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74  a.** zero is ret
1d420 75 72 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65  urned..*/.sqlite
1d430 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42  3_int64 sqlite3B
1d440 74 72 65 65 47 65 74 43 61 63 68 65 64 52 6f 77  treeGetCachedRow
1d450 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
1d460 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
1d470 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a  r->cachedRowid;.
1d480 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1d490 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
1d4a0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1d4b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
1d4c0 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
1d4d0 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
1d4e0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
1d4f0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1d500 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
1d510 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
1d520 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
1d530 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
1d540 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
1d550 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
1d560 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1d570 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1d580 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
1d590 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
1d5a0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
1d5b0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
1d5c0 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
1d5d0 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76       pCur->pPrev
1d5e0 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
1d5f0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
1d600 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
1d610 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
1d620 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
1d630 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1d640 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  .      pCur->pNe
1d650 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
1d660 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20  ->pPrev;.    }. 
1d670 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
1d680 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
1d690 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1d6a0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
1d6b0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
1d6c0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1d6d0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
1d6e0 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1d6f0 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
1d700 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
1d710 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
1d720 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1d730 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
1d740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
1d760 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1d770 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1d780 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1d790 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1d7a0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1d7b0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1d7c0 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1d7d0 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
1d7e0 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
1d7f0 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
1d800 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
1d810 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
1d820 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
1d830 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
1d840 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
1d850 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
1d860 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
1d870 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
1d880 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
1d890 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
1d8a0 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
1d8b0 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
1d8c0 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
1d8d0 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
1d8e0 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
1d8f0 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
1d900 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
1d910 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
1d920 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
1d930 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
1d940 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
1d950 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
1d960 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
1d970 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
1d980 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
1d990 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
1d9a0 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
1d9b0 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20  doing agressive 
1d9c0 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77  inlining.)  So w
1d9d0 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e  e use a real fun
1d9e0 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56  ction.** for MSV
1d9f0 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f  C and a macro fo
1da00 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  r everything els
1da10 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37  e.  Ticket #2457
1da20 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1da30 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69  BUG.  static voi
1da40 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  d assertCellInfo
1da50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1da60 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
1da70 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61  nfo;.    int iPa
1da80 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1da90 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e  ;.    memset(&in
1daa0 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e  fo, 0, sizeof(in
1dab0 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50  fo));.    btreeP
1dac0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1dad0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43  pPage[iPage], pC
1dae0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1daf0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
1db00 73 65 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e  sert( memcmp(&in
1db10 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c  fo, &pCur->info,
1db20 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d   sizeof(info))==
1db30 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  0 );.  }.#else. 
1db40 20 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43   #define assertC
1db50 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69  ellInfo(x).#endi
1db60 66 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45  f.#ifdef _MSC_VE
1db70 52 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61  R.  /* Use a rea
1db80 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53  l function in MS
1db90 56 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  VC to work aroun
1dba0 64 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63  d bugs in that c
1dbb0 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74  ompiler. */.  st
1dbc0 61 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c  atic void getCel
1dbd0 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
1dbe0 70 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70  pCur){.    if( p
1dbf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
1dc00 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1dc10 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
1dc20 61 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65  age;.      btree
1dc30 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
1dc40 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
1dc50 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
1dc60 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
1dc70 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
1dc80 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65  NKey = 1;.    }e
1dc90 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1dca0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1dcb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
1dcc0 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f   /* if not _MSC_
1dcd0 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20  VER */.  /* Use 
1dce0 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f  a macro in all o
1dcf0 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73  ther compilers s
1dd00 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  o that the funct
1dd10 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a  ion is inlined *
1dd20 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c  /.#define getCel
1dd30 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20  lInfo(pCur)     
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
1dd80 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
1dd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddc0 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67    \.    int iPag
1ddd0 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 20 20 20 5c 0a 20 20 20 20 62 74 72 65 65 50 61     \.    btreePa
1de20 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
1de30 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
1de40 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
1de50 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20  pCur->info); \. 
1de60 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
1de70 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ey = 1;         
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1deb0 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20    }else{        
1dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1df00 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
1df10 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  \.  }.#endif /* 
1df60 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66  _MSC_VER */..#if
1df70 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
1df80 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
1df90 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
1dfa0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1dfb0 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
1dfc0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1dfd0 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
1dfe0 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
1dff0 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
1e000 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
1e010 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
1e020 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
1e030 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
1e040 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
1e050 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
1e060 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
1e070 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
1e080 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
1e090 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1e0a0 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
1e0b0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1e0c0 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
1e0d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1e0e0 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
1e0f0 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
1e100 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
1e110 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  ze to the size o
1e120 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65  f the buffer nee
1e130 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ded to hold the 
1e140 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20  value of.** the 
1e150 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72  key for the curr
1e160 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ent entry.  If t
1e170 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
1e180 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20   pointing.** to 
1e190 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a  a valid entry, *
1e1a0 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
1e1b0 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20  0. .**.** For a 
1e1c0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49  table with the I
1e1d0 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20  NTKEY flag set, 
1e1e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
1e1f0 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20  urns the key.** 
1e200 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20  itself, not the 
1e210 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1e220 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  in the key..**.*
1e230 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
1e240 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63  t position the c
1e250 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69  ursor prior to i
1e260 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75  nvoking this rou
1e270 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69  tine..** .** Thi
1e280 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
1e290 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79   fail.  It alway
1e2a0 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
1e2b0 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71  _OK.  .*/.int sq
1e2c0 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1e2d0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1e2e0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1e2f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e300 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e310 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1e320 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1e330 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
1e340 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1e350 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  R_VALID );.  if(
1e360 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
1e370 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1e380 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20     *pSize = 0;. 
1e390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 65 74 43   }else{.    getC
1e3a0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1e3b0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
1e3c0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
1e3d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e3e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
1e3f0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
1e400 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1e410 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20 65  of data in the e
1e420 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73  ntry the.** curs
1e430 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  or currently poi
1e440 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  nts to..**.** Th
1e450 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75  e caller must gu
1e460 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
1e470 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
1e480 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c  ing to a non-NUL
1e490 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79  L.** valid entry
1e4a0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1e4b0 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70  s, the calling p
1e4c0 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75  rocedure must gu
1e4d0 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20  arantee.** that 
1e4e0 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43  the cursor has C
1e4f0 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55  ursor.eState==CU
1e500 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a  RSOR_VALID..**.*
1e510 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74  * Failure is not
1e520 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73   possible.  This
1e530 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
1e540 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1e550 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20  OK..** It might 
1e560 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20  just as well be 
1e570 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65 74  a procedure (ret
1e580 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74  urning void) but
1e590 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20   we continue.** 
1e5a0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74  to return an int
1e5b0 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65  eger result code
1e5c0 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20   for historical 
1e5d0 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  reasons..*/.int 
1e5e0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1e5f0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1e600 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29  Cur, u32 *pSize)
1e610 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1e620 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1e630 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1e640 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1e650 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1e660 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1e670 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  );.  *pSize = pC
1e680 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  ur->info.nData;.
1e690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e6a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  OK;.}../*.** Giv
1e6b0 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
1e6c0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
1e6d0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
1e6e0 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
1e6f0 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
1e700 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
1e710 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e720 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
1e730 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
1e740 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
1e750 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
1e760 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
1e770 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
1e780 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
1e790 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
1e7a0 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
1e7b0 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
1e7c0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
1e7d0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1e7e0 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
1e7f0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1e800 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
1e810 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1e820 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
1e830 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
1e840 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
1e850 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
1e860 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
1e870 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
1e880 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1e890 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
1e8a0 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
1e8b0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
1e8c0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
1e8d0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
1e8e0 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
1e8f0 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
1e900 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
1e910 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
1e920 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
1e930 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
1e940 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1e950 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
1e960 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
1e970 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
1e980 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
1e990 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
1e9a0 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
1e9b0 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
1e9c0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
1e9d0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
1e9e0 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
1e9f0 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
1ea00 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
1ea10 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
1ea20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
1ea30 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
1ea40 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
1ea50 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
1ea60 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
1ea70 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1ea80 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1ea90 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
1eaa0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
1eab0 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1ead0 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
1eae0 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
1eaf0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
1eb00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
1eb10 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
1eb20 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
1eb30 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
1eb40 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
1eb50 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
1eb60 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1eb70 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
1eb80 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
1eb90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
1eba0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
1ebb0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
1ebc0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1ebd0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1ebe0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1ebf0 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
1ec00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1ec10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
1ec20 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
1ec30 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
1ec40 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
1ec50 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
1ec60 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
1ec70 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
1ec80 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
1ec90 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
1eca0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
1ecb0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
1ecc0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
1ecd0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
1ece0 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
1ecf0 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
1ed00 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
1ed10 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
1ed20 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
1ed30 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
1ed40 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
1ed50 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
1ed60 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
1ed70 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
1ed80 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
1ed90 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
1eda0 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
1edb0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1edc0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
1edd0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
1ede0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1edf0 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
1ee00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1ee10 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
1ee20 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
1ee30 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1ee40 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
1ee50 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
1ee60 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1ee70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
1ee80 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1ee90 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
1eea0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
1eeb0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
1eec0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1eed0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
1eee0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1eef0 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
1ef00 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
1ef10 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
1ef20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ef30 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1ef40 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
1ef50 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  &pPage, 0);.    
1ef60 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1ef70 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
1ef80 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
1ef90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1efa0 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
1efb0 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1efc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1efd0 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
1efe0 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
1eff0 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
1f000 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
1f010 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1f020 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
1f030 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
1f040 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
1f050 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
1f060 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
1f070 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
1f080 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
1f090 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
1f0a0 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
1f0b0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1f0c0 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
1f0d0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1f0e0 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
1f0f0 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
1f100 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
1f110 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
1f120 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
1f130 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
1f140 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
1f150 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
1f160 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
1f170 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
1f180 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
1f190 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
1f1a0 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
1f1b0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1f1c0 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
1f1d0 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
1f1e0 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
1f1f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1f200 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
1f210 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
1f220 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
1f230 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
1f240 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
1f250 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1f260 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
1f270 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
1f280 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1f290 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1f2a0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
1f2b0 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
1f2c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f2d0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
1f2e0 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
1f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f300 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
1f310 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
1f320 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
1f330 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
1f340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1f350 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
1f360 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
1f370 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
1f380 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
1f390 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
1f3a0 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
1f3b0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
1f3c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f3d0 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
1f3e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f3f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1f400 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1f410 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
1f420 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
1f430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f440 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1f450 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
1f460 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
1f470 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
1f480 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
1f490 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
1f4a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f4b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1f4c0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1f4d0 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
1f4e0 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
1f4f0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
1f500 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1f510 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
1f520 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66   pointing to. If
1f530 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61   the eOp.** para
1f540 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73  meter is 0, this
1f550 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
1f560 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65  tion (data copie
1f570 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72  d into.** buffer
1f580 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73   pBuf). If it is
1f590 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69   non-zero, a wri
1f5a0 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  te (data copied 
1f5b0 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70  from.** buffer p
1f5c0 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  Buf)..**.** A to
1f5d0 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
1f5e0 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
1f5f0 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
1f600 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1f610 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
1f620 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
1f630 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
1f640 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e  The content bein
1f650 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  g read or writte
1f660 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f  n might appear o
1f670 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a  n the main page.
1f680 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72  ** or be scatter
1f690 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70  ed out on multip
1f6a0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  le overflow page
1f6b0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
1f6c0 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62  BtCursor.isIncrb
1f6d0 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1f6e0 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63  s set, and the c
1f6f0 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72  urrent.** cursor
1f700 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
1f710 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
1f720 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e   pages, this fun
1f730 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74  ction.** allocat
1f740 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  es space for and
1f750 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65   lazily popluate
1f760 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
1f770 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63  age-list .** cac
1f780 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
1f790 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53  or.aOverflow). S
1f7a0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1f7b0 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68  use this.** cach
1f7c0 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
1f7d0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
1f7e0 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66  d offset more ef
1f7f0 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
1f800 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
1f810 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1f820 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1f830 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
1f840 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
1f850 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
1f860 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
1f870 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
1f880 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
1f890 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
1f8a0 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
1f8b0 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
1f8c0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
1f8d0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
1f8e0 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
1f8f0 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
1f900 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1f910 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
1f920 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1f930 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
1f940 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
1f950 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
1f960 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
1f970 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
1f980 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
1f990 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
1f9a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
1f9b0 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
1f9c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1f9d0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1f9e0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
1f9f0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1fa00 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
1fa10 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
1fa20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
1fa30 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
1fa40 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
1fa50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
1fa60 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1fa70 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1fa80 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
1fa90 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
1faa0 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
1fab0 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20   .  int eOp     
1fac0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
1fad0 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
1fae0 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
1faf0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
1fb00 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
1fb10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1fb20 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  OK;.  u32 nKey;.
1fb30 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a    int iIdx = 0;.
1fb40 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1fb50 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1fb60 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
1fb70 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63   Btree page of c
1fb80 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a  urrent entry */.
1fb90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1fba0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20  = pCur->pBt;    
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fbc0 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73   Btree this curs
1fbd0 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f  or belongs to */
1fbe0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1fbf0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1fc00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1fc10 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
1fc20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1fc30 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1fc40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
1fc50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1fc60 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1fc70 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   );..  getCellIn
1fc80 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1fc90 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1fca0 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e  o.pCell + pCur->
1fcb0 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
1fcc0 6e 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69  nKey = (pPage->i
1fcd0 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28 69 6e 74  ntKey ? 0 : (int
1fce0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
1fcf0 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
1fd00 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65  offset+amt > nKe
1fd10 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61  y+pCur->info.nDa
1fd20 74 61 29 20 0a 20 20 20 7c 7c 20 26 61 50 61 79  ta) .   || &aPay
1fd30 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
1fd40 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65  nLocal] > &pPage
1fd50 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61  ->aData[pBt->usa
1fd60 62 6c 65 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20  bleSize].  ){.  
1fd70 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
1fd80 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
1fd90 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1fda0 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
1fdb0 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
1fdc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1fdd0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
1fde0 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
1fdf0 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
1fe00 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
1fe10 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
1fe20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
1fe30 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
1fe40 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
1fe50 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
1fe60 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
1fe70 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
1fe80 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
1fe90 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
1fea0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
1feb0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
1fec0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
1fed0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
1fee0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1fef0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1ff00 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
1ff10 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d     amt -= a;.  }
1ff20 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74  else{.    offset
1ff30 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   -= pCur->info.n
1ff40 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  Local;.  }..  if
1ff50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ff60 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
1ff70 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
1ff80 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
1ff90 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
1ffa0 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
1ffb0 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
1ffc0 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
1ffd0 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
1ffe0 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
1fff0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
20000 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66  ocal]);..#ifndef
20010 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
20020 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20  RBLOB.    /* If 
20030 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61  the isIncrblobHa
20040 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
20050 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f   and the BtCurso
20060 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20  r.aOverflow[].  
20070 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65    ** has not bee
20080 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
20090 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68  ocate it now. Th
200a0 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  e array is sized
200b0 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65   at.    ** one e
200c0 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
200d0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
200e0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
200f0 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61  n. The.    ** pa
20100 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
20110 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
20120 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
20130 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a  n aOverflow[0],.
20140 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61      ** etc. A va
20150 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
20160 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
20170 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  y means "not yet
20180 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28   known".    ** (
20190 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
201a0 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
201b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
201c0 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Cur->isIncrblobH
201d0 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e  andle && !pCur->
201e0 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
201f0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
20200 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
20210 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
20220 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
20230 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
20240 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
20250 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69  w = (Pgno *)sqli
20260 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
20270 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c  zeof(Pgno)*nOvfl
20280 29 3b 0a 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66  );.      /* nOvf
20290 6c 20 69 73 20 61 6c 77 61 79 73 20 70 6f 73 69  l is always posi
202a0 74 69 76 65 2e 20 20 49 66 20 69 74 20 77 65 72  tive.  If it wer
202b0 65 20 7a 65 72 6f 2c 20 66 65 74 63 68 50 61 79  e zero, fetchPay
202c0 6c 6f 61 64 20 77 6f 75 6c 64 20 68 61 76 65 0a  load would have.
202d0 20 20 20 20 20 20 2a 2a 20 62 65 65 6e 20 75 73        ** been us
202e0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
202f0 69 73 20 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20  is routine. */. 
20300 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
20310 6e 4f 76 66 6c 29 20 26 26 20 21 70 43 75 72 2d  nOvfl) && !pCur-
20320 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
20330 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20340 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
20350 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
20360 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  f the overflow p
20370 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
20380 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
20390 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a  d and the.    **
203a0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
203b0 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76  irst required ov
203c0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76  erflow page is v
203d0 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a  alid, skip.    *
203e0 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
203f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
20400 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
20410 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
20420 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
20430 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69 49  ize] ){.      iI
20440 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
20450 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65  lSize);.      ne
20460 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
20470 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
20480 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
20490 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
204a0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
204b0 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53      for( ; rc==S
204c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
204d0 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20 69  0 && nextPage; i
204e0 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66  Idx++){..#ifndef
204f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
20500 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49  RBLOB.      /* I
20510 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
20520 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
20530 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
20540 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
20550 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
20560 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
20570 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t(!pCur->aOverfl
20580 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75 72  ow[iIdx] || pCur
20590 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
205a0 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  ]==nextPage);.  
205b0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
205c0 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65  rflow[iIdx] = ne
205d0 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  xtPage;.      }.
205e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69 66  #endif..      if
205f0 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
20600 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
20610 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
20620 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
20630 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
20640 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
20650 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
20660 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
20670 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
20680 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
20690 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
206a0 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
206b0 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
206c0 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
206d0 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
206e0 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
206f0 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
20700 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
20710 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
20720 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
20730 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  n..        */.#i
20740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20750 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
20760 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
20770 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
20780 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
20790 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ] ){.          n
207a0 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
207b0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31  aOverflow[iIdx+1
207c0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  ];.        } els
207d0 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  e .#endif.      
207e0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
207f0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
20800 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
20810 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 6f  Page);.        o
20820 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
20830 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
20840 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
20850 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
20860 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
20870 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
20880 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
20890 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
208a0 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
208b0 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
208c0 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
208d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
208e0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
208f0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  ;.        int a 
20900 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 72  = amt;.        r
20910 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20920 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
20930 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
20940 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
20950 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20960 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50 61  ){.          aPa
20970 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
20980 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
20990 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
209a0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
209b0 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
209c0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b           if( a +
209d0 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
209e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
209f0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
20a00 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
20a10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
20a20 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
20a30 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
20a40 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  +4], pBuf, a, eO
20a50 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  p, pDbPage);.   
20a60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
20a70 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
20a80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66 66  );.          off
20a90 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
20aa0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
20ab0 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
20ac0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20ad0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
20ae0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20af0 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
20b00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20b10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20b20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
20b30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
20b40 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73  rt of the key as
20b50 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
20b60 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
20b70 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
20b80 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
20b90 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
20ba0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
20bb0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
20bc0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
20bd0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
20be0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
20bf0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
20c00 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
20c10 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
20c20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
20c30 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
20c40 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
20c50 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
20c60 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
20c70 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
20c80 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
20c90 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
20ca0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
20cb0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
20cc0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
20cd0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
20ce0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
20cf0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
20d00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
20d10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
20d20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
20d30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
20d40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
20d50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
20d60 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
20d70 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20d80 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
20d90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20da0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
20db0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
20dc0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
20dd0 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
20de0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
20df0 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
20e00 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
20e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
20e20 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
20e30 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20e40 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
20e50 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
20e60 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
20e70 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
20e80 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
20e90 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
20ea0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
20eb0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20ec0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
20ed0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
20ee0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
20ef0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
20f00 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
20f10 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
20f20 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
20f30 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
20f40 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
20f50 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
20f60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
20f70 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
20f80 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
20f90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
20fa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20fb0 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
20fc0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20fd0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
20fe0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20ff0 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
21000 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
21010 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21020 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
21030 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
21040 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
21050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21060 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
21070 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21080 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21090 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
210a0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
210b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
210c0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
210d0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
210e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
210f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21100 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
21110 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
21120 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
21130 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
21140 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
21150 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21160 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21170 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
21180 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
21190 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
211a0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
211b0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
211c0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
211d0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
211e0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
211f0 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64  f skipKey==0 and
21200 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
21210 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
21220 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65  ata if.** skipKe
21230 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65  y==1.  The numbe
21240 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
21250 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61  ailable key/data
21260 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
21270 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
21280 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
21290 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
212a0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20   will not be.** 
212b0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
212c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
212d0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
212e0 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
212f0 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
21300 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
21310 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
21320 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
21330 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
21340 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
21350 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
21360 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
21370 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
21380 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
21390 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
213a0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
213b0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
213c0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
213d0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
213e0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
213f0 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
21400 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
21410 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
21420 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
21430 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
21440 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
21450 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
21460 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
21470 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
21480 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
21490 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
214a0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
214b0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
214c0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
214d0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
214e0 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
214f0 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
21500 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
21510 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
21520 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
21530 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
21540 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
21550 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
21560 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
21570 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
21580 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
21590 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
215a0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
215b0 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
215c0 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
215d0 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
215e0 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
215f0 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
21600 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
21610 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
21620 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
21630 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75  .  u32 nKey;.  u
21640 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  32 nLocal;..  as
21650 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
21660 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
21670 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
21680 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20  pCur->iPage]);. 
21690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
216a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
216b0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
216c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
216d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61  x(pCur) );.  pPa
216e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
216f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
21700 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
21710 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21720 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
21730 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
21740 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
21750 3d 30 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65  =0) ){.    btree
21760 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
21770 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21780 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78  ge], pCur->aiIdx
21790 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20  [pCur->iPage],. 
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a    &pCur->info);.
217c0 20 20 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d    }.  aPayload =
217d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
217e0 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  l;.  aPayload +=
217f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
21800 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
21810 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
21820 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
21830 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69  e{.    nKey = (i
21840 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
21850 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
21860 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
21870 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
21880 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
21890 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
218a0 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
218b0 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
218c0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
218d0 20 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61     assert( nLoca
218e0 6c 3c 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20  l<=nKey );.  }. 
218f0 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
21900 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
21910 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
21920 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
21930 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
21940 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
21950 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
21960 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
21970 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
21980 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
21990 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
219a0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
219b0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
219c0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
219d0 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
219e0 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
219f0 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
21a00 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
21a10 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
21a20 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
21a30 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
21a40 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
21a50 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
21a60 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
21a70 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
21a80 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
21a90 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
21aa0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
21ab0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
21ac0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
21ad0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
21ae0 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
21af0 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
21b00 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
21b10 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
21b20 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
21b30 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
21b40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
21b50 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
21b60 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
21b70 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
21b80 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
21b90 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  *pAmt){.  const 
21ba0 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61  void *p = 0;.  a
21bb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21bc0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
21bd0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
21be0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
21bf0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21c00 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
21c10 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74  ALWAYS(pCur->eSt
21c20 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21c30 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63  D) ){.    p = (c
21c40 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
21c50 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
21c60 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 0);.  }.  re
21c70 74 75 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20  turn p;.}.const 
21c80 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
21c90 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
21ca0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
21cb0 2a 70 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  *pAmt){.  const 
21cc0 76 6f 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61  void *p = 0;.  a
21cd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
21ce0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
21cf0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
21d00 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
21d10 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
21d20 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
21d30 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74  ALWAYS(pCur->eSt
21d40 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21d50 44 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63  D) ){.    p = (c
21d60 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68  onst void*)fetch
21d70 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
21d80 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  mt, 1);.  }.  re
21d90 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn p;.}.../*.*
21da0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
21db0 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20  r down to a new 
21dc0 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65  child page.  The
21dd0 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e   newPgno argumen
21de0 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65  t is the.** page
21df0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63   number of the c
21e00 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76  hild page to mov
21e10 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  e to..**.** This
21e20 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
21e30 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
21e40 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61   if the page-hea
21e50 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20  der flags field 
21e60 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68  of.** the new ch
21e70 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f  ild page does no
21e80 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67  t match the flag
21e90 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70  s field of the p
21ea0 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69  arent (i.e..** i
21eb0 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65  f an intkey page
21ec0 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74   appears to be t
21ed0 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e  he parent of a n
21ee0 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20  on-intkey page, 
21ef0 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61  or.** vice-versa
21f00 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
21f10 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43   moveToChild(BtC
21f20 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
21f30 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74   newPgno){.  int
21f40 20 72 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70   rc;.  int i = p
21f50 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65  Cur->iPage;.  Me
21f60 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
21f70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21f80 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20   = pCur->pBt;.. 
21f90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21fa0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21fb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21fc0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21fd0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
21fe0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
21ff0 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
22000 50 54 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75  PTH );.  if( pCu
22010 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
22020 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
22030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
22040 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22050 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
22060 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
22070 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
22080 77 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  wPage);.  if( rc
22090 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
220a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31  pCur->apPage[i+1
220b0 5d 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20  ] = pNewPage;.  
220c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d  pCur->aiIdx[i+1]
220d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50   = 0;.  pCur->iP
220e0 61 67 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e  age++;..  pCur->
220f0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
22100 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
22110 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
22120 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c  wPage->nCell<1 |
22130 7c 20 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b  | pNewPage->intK
22140 65 79 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  ey!=pCur->apPage
22150 5b 69 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  [i]->intKey ){. 
22160 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22170 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22180 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
22190 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE_OK;.}..#ifnde
221a0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  f NDEBUG./*.** P
221b0 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
221c0 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
221d0 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
221e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
221f0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
22200 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
22210 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
22220 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
22230 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
22240 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
22250 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
22260 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
22270 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
22280 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
22290 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
222a0 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
222b0 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
222c0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
222d0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
222e0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
222f0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
22300 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
22310 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49  d){.  assert( iI
22320 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
22330 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
22340 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
22350 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22360 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
22370 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
22380 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
22390 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
223a0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
223b0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
223c0 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
223d0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
223e0 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
223f0 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
22400 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
22410 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
22420 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
22430 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
22440 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
22450 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
22460 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
22470 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
22480 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
22490 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
224a0 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
224b0 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
224c0 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
224d0 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
224e0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
224f0 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
22500 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
22510 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
22520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
22530 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
22540 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
22550 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
22560 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
22570 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
22580 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
22590 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
225a0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
225b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
225c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
225d0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
225e0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
225f0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
22600 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
22610 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
22620 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
22630 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
22640 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
22650 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65  pgno.  );.  rele
22660 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
22670 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22680 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  ]);.  pCur->iPag
22690 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  e--;.  pCur->inf
226a0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
226b0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
226c0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   0;.}../*.** Mov
226d0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
226e0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
226f0 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
22700 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
22710 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
22720 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
22730 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
22740 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
22750 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
22760 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
22770 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
22780 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
22790 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
227a0 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
227b0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
227c0 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
227d0 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
227e0 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
227f0 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
22800 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
22810 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
22820 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
22830 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
22840 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
22850 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
22860 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
22870 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
22880 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
22890 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ID. Otherwise, t
228a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
228b0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
228c0 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c   first.** cell l
228d0 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
228e0 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ot (or virtual r
228f0 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
22900 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a  e cursor state.*
22910 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  * is set to CURS
22920 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
22930 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
22940 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
22950 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
22960 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
22970 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
22980 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
22990 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
229a0 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
229b0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
229c0 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
229d0 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
229e0 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
229f0 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
22a00 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
22a10 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
22a20 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
22a30 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
22a40 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
22a50 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
22a60 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
22a70 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
22a80 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
22a90 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
22aa0 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
22ab0 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
22ac0 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
22ad0 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
22ae0 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
22af0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
22b00 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
22b10 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
22b20 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
22b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72  SQLITE_OK;.  Btr
22b40 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
22b50 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
22b60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
22b70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
22b80 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
22b90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
22ba0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
22bb0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
22bc0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
22bd0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
22be0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
22bf0 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
22c00 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
22c10 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
22c20 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
22c30 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
22c40 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
22c50 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
22c60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
22c70 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73  AULT ){.      as
22c80 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
22c90 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
22ca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
22cb0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
22cc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22cd0 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
22ce0 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
22cf0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
22d00 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
22d10 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
22d20 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b  =pCur->iPage; i+
22d30 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  +){.      releas
22d40 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
22d50 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge[i]);.    }.  
22d60 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
22d70 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
22d80 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
22d90 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
22da0 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
22db0 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 20 20  apPage[0]);.    
22dc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22dd0 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
22de0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
22df0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
22e00 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
22e10 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
22e20 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66   = 0;..    /* If
22e30 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
22e40 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
22e50 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
22e60 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
22e70 72 73 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65  rsor.    ** expe
22e80 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20  cted to open it 
22e90 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  on an index b-tr
22ea0 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ee. Otherwise, i
22eb0 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20  f pKeyInfo is.  
22ec0 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
22ed0 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
22ee0 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
22ef0 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
22f00 20 63 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65   case,.    ** re
22f10 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
22f20 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a  ORRUPT error.  *
22f30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  /.    assert( pC
22f40 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
22f50 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72  ntKey==1 || pCur
22f60 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
22f70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Key==0 );.    if
22f80 28 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ( (pCur->pKeyInf
22f90 6f 3d 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50  o==0)!=pCur->apP
22fa0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29  age[0]->intKey )
22fb0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
22fc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22fd0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
22fe0 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
22ff0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
23000 20 6f 66 20 74 68 65 20 63 6f 72 72 65 63 74 20   of the correct 
23010 74 79 70 65 2e 20 54 68 69 73 20 6d 75 73 74 20  type. This must 
23020 62 65 20 74 68 65 0a 20 20 2a 2a 20 63 61 73 65  be the.  ** case
23030 20 61 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   as the call to 
23040 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 68  this function th
23050 61 74 20 6c 6f 61 64 65 64 20 74 68 65 20 72 6f  at loaded the ro
23060 6f 74 2d 70 61 67 65 20 28 65 69 74 68 65 72 0a  ot-page (either.
23070 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 6f    ** this call o
23080 72 20 61 20 70 72 65 76 69 6f 75 73 20 69 6e 76  r a previous inv
23090 6f 63 61 74 69 6f 6e 29 20 77 6f 75 6c 64 20 68  ocation) would h
230a0 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
230b0 72 75 70 74 69 6f 6e 20 0a 20 20 2a 2a 20 69 66  ruption .  ** if
230c0 20 74 68 65 20 61 73 73 75 6d 70 74 69 6f 6e 20   the assumption 
230d0 77 65 72 65 20 6e 6f 74 20 74 72 75 65 2c 20 61  were not true, a
230e0 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  nd it is not pos
230f0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 66 6c  sible for the fl
23100 61 67 73 20 0a 20 20 2a 2a 20 62 79 74 65 20 74  ags .  ** byte t
23110 6f 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69  o have been modi
23120 66 69 65 64 20 77 68 69 6c 65 20 74 68 69 73 20  fied while this 
23130 63 75 72 73 6f 72 20 69 73 20 68 6f 6c 64 69 6e  cursor is holdin
23140 67 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20 20  g a reference.  
23150 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20  ** to the page. 
23160 20 2a 2f 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43   */.  pRoot = pC
23170 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
23180 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
23190 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
231a0 52 6f 6f 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Root );.  assert
231b0 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 20  ( pRoot->isInit 
231c0 26 26 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  && (pCur->pKeyIn
231d0 66 6f 3d 3d 30 29 3d 3d 70 52 6f 6f 74 2d 3e 69  fo==0)==pRoot->i
231e0 6e 74 4b 65 79 20 29 3b 0a 0a 20 20 70 43 75 72  ntKey );..  pCur
231f0 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
23200 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23210 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
23220 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43  atLast = 0;.  pC
23230 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
23240 30 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  0;..  if( pRoot-
23250 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52  >nCell==0 && !pR
23260 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
23270 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
23280 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
23290 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
232a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
232b0 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
232c0 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
232d0 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
232e0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
232f0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
23300 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
23310 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
23320 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
23330 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
23340 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
23350 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e   ((pRoot->nCell>
23360 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a  0)?CURSOR_VALID:
23370 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b  CURSOR_INVALID);
23380 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
23390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
233a0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
233b0 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
233c0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
233d0 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
233e0 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
233f0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
23400 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
23410 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
23420 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
23430 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
23440 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
23450 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
23460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
23470 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
23480 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23490 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
234a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
234b0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
234c0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
234d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
234e0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
234f0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23500 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23510 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
23520 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
23530 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
23540 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
23550 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
23560 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
23570 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
23580 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
23590 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
235a0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
235b0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
235c0 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
235d0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
235e0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
235f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
23610 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
23620 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
23630 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
23640 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
23650 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
23660 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
23670 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
23680 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
23690 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
236a0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
236b0 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
236c0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
236d0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
236e0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
236f0 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
23700 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
23710 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
23720 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
23730 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
23740 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
23750 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
23760 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
23770 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
23780 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
23790 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
237a0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
237b0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
237c0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
237d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
237e0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
237f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
23800 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
23810 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
23820 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23830 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23840 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
23850 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
23860 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
23870 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50  QLITE_OK && !(pP
23880 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
23890 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
238a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
238b0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
238c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
238d0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
238e0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
238f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
23900 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
23910 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
23920 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
23930 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
23940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23950 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23960 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
23970 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70  ->nCell-1;.    p
23980 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
23990 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
239a0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
239b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
239c0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
239d0 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
239e0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
239f0 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
23a00 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
23a10 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
23a20 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
23a30 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
23a40 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
23a50 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
23a60 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
23a70 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
23a80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23a90 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
23aa0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
23ab0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
23ac0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23ad0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23af0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
23b00 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
23b10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
23b20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
23b30 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
23b40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
23b50 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
23b60 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
23b70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23b80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23b90 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
23ba0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  l==0 );.      *p
23bb0 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Res = 1;.    }el
23bc0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
23bd0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23be0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
23bf0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70  ll>0 );.      *p
23c00 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
23c10 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
23c20 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  st(pCur);.    }.
23c30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23c40 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
23c50 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
23c60 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
23c70 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
23c80 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
23c90 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
23ca0 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
23cb0 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
23cc0 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
23cd0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
23ce0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
23cf0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
23d00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23d10 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
23d20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
23d30 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
23d40 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23d50 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23d60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
23d70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23d80 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
23d90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
23da0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
23db0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
23dc0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
23dd0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
23de0 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
23df0 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
23e00 65 53 74 61 74 65 20 26 26 20 70 43 75 72 2d 3e  eState && pCur->
23e10 61 74 4c 61 73 74 20 29 7b 0a 23 69 66 64 65 66  atLast ){.#ifdef
23e20 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
23e30 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
23e40 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
23e50 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
23e60 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
23e70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
23e80 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
23e90 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
23ea0 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
23eb0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
23ec0 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
23ed0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23ee0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
23ef0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
23f00 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
23f10 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
23f20 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
23f30 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
23f40 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
23f50 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
23f60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23f70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23f80 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
23f90 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
23fa0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
23fb0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
23fc0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
23fd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23fe0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
23ff0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
24000 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
24010 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
24020 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24030 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
24040 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
24050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
24060 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
24070 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
24080 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
24090 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
240a0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
240b0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75  pCur);.      pCu
240c0 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d  r->atLast = rc==
240d0 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30 3b 0a  SQLITE_OK ?1:0;.
240e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
240f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
24100 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
24110 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
24120 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
24130 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
24140 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
24150 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
24160 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
24170 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
24180 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
24190 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
241a0 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
241b0 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
241c0 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
241d0 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
241e0 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
241f0 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
24200 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
24210 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
24220 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
24230 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
24240 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
24250 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
24260 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
24270 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
24280 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
24290 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
242a0 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
242b0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
242c0 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
242d0 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
242e0 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
242f0 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
24300 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
24310 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
24320 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
24330 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
24340 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
24350 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
24360 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
24370 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
24380 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
24390 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
243a0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
243b0 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
243c0 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
243d0 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
243e0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
24410 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
24420 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
24430 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
24450 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
24460 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
24470 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
24480 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
24490 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
244a0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
244b0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
244c0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
244d0 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
244e0 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
244f0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
24500 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
24510 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
24520 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
24530 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24550 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
24560 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
24570 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  *.*/.int sqlite3
24580 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
24590 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
245a0 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
245b0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  /* The cursor to
245c0 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55   be moved */.  U
245d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
245e0 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63  IdxKey, /* Unpac
245f0 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
24600 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20  .  i64 intKey,  
24610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24620 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a  he table key */.
24630 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c    int biasRight,
24640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
24650 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20   true, bias the 
24660 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
24670 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
24680 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
24690 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65       /* Write se
246a0 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72  arch results her
246b0 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
246c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
246d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
246e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
246f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
24700 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
24710 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
24720 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20 29    assert( pRes )
24730 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49 64  ;.  assert( (pId
24740 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
24750 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b  >pKeyInfo==0) );
24760 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
24770 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
24780 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68  positioned at th
24790 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74  e point we are t
247a0 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f  rying.  ** to mo
247b0 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74  ve to, then just
247c0 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
247d0 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a  doing any work *
247e0 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  /.  if( pCur->eS
247f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24800 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69  ID && pCur->vali
24810 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75  dNKey .   && pCu
24820 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
24830 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69  tKey .  ){.    i
24840 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
24850 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
24860 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
24870 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24880 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
24890 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73   if( pCur->atLas
248a0 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t && pCur->info.
248b0 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20  nKey<intKey ){. 
248c0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b       *pRes = -1;
248d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
248e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
248f0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
24900 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
24910 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
24920 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
24930 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
24940 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
24950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
24960 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24970 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29  iPage]->isInit )
24980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
24990 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
249a0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  Page]->nCell>0 |
249b0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
249c0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
249d0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
249e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
249f0 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65  ALID ){.    *pRe
24a00 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65  s = -1;.    asse
24a10 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
24a20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
24a30 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
24a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24a50 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
24a60 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
24a70 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  intKey || pIdxKe
24a80 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
24a90 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
24aa0 2c 20 69 64 78 3b 0a 20 20 20 20 50 67 6e 6f 20  , idx;.    Pgno 
24ab0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
24ac0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
24ad0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
24ae0 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20  iPage];.    int 
24af0 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  c;..    /* pPage
24b00 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
24b10 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
24b20 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
24b30 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
24b40 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
24b50 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
24b60 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
24b70 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
24b80 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
24b90 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
24ba0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
24bb0 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
24bc0 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
24bd0 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
24be0 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
24bf0 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
24c00 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
24c10 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
24c20 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
24c30 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
24c40 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
24c50 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
24c60 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
24c70 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
24c80 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
24c90 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
24ca0 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
24cb0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
24cc0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
24cd0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
24ce0 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
24cf0 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
24d00 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
24d10 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69  ->nCell-1;.    i
24d20 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b 0a  f( biasRight ){.
24d30 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
24d40 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
24d50 20 28 75 31 36 29 28 69 64 78 20 3d 20 75 70 72   (u16)(idx = upr
24d60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24d70 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
24d80 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
24d90 75 31 36 29 28 69 64 78 20 3d 20 28 75 70 72 2b  u16)(idx = (upr+
24da0 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20  lwr)/2);.    }. 
24db0 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
24dc0 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20    u8 *pCell;    
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24de0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24df0 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c 6c   to current cell
24e00 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20   in pPage */..  
24e10 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3d      assert( idx=
24e20 3d 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  =pCur->aiIdx[pCu
24e30 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20  r->iPage] );.   
24e40 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
24e50 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ize = 0;.      p
24e60 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
24e70 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70 50  pPage, idx) + pP
24e80 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
24e90 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  e;.      if( pPa
24ea0 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
24eb0 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b        i64 nCellK
24ec0 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ey;.        if( 
24ed0 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29  pPage->hasData )
24ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
24ef0 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  dummy;.         
24f00 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72   pCell += getVar
24f10 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d  int32(pCell, dum
24f20 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  my);.        }. 
24f30 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
24f40 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
24f50 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
24f60 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d    if( nCellKey==
24f70 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
24f80 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
24f90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65     }else if( nCe
24fa0 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
24fb0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31            c = -1
24fc0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24fd0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
24fe0 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  t( nCellKey>intK
24ff0 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
25000 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
25010 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  }.        pCur->
25020 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
25030 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
25040 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
25050 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  y;.      }else{.
25060 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
25070 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
25080 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35   page-size is 65
25090 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20  536 bytes. This 
250a0 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20  means that.     
250b0 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
250c0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  m number of reco
250d0 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20  rd bytes stored 
250e0 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72  on an index B-Tr
250f0 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ee.        ** pa
25100 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ge is less than 
25110 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20  16384 bytes and 
25120 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73  may be stored as
25130 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20   a 2-byte.      
25140 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69    ** varint. Thi
25150 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
25160 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74   used to attempt
25170 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e   to avoid parsin
25180 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  g .        ** th
25190 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79  e entire cell by
251a0 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68   checking for th
251b0 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68  e cases where th
251c0 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20  e record is .   
251d0 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65       ** stored e
251e0 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74  ntirely within t
251f0 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62  he b-tree page b
25200 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65  y inspecting the
25210 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20   first .        
25220 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68  ** 2 bytes of th
25230 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20  e cell..        
25240 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
25250 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
25260 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28 6e  .        if( !(n
25270 43 65 6c 6c 20 26 20 30 78 38 30 29 20 26 26 20  Cell & 0x80) && 
25280 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61  nCell<=pPage->ma
25290 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
252a0 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
252b0 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72  ch runs if the r
252c0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
252d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20   of the cell is 
252e0 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
252f0 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e  ingle byte varin
25300 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
25310 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
25320 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20  n the main.     
25330 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70       ** b-tree p
25340 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
25350 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
25360 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
25370 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
25380 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
25390 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
253a0 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
253b0 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
253c0 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
253d0 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
253e0 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
253f0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
25400 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25410 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
25420 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
25430 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
25440 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
25450 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
25460 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
25470 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
25480 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
25490 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
254a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
254b0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
254c0 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
254d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
254e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
254f0 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
25500 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
25510 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
25520 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
25530 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
25540 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
25550 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
25560 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
25570 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
25580 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
25590 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
255a0 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
255b0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
255c0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
255d0 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
255e0 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
255f0 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20  called. */.     
25600 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
25610 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
25620 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
25630 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
25640 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
25650 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  e;.          btr
25660 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
25670 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
25680 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
25690 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
256a0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
256b0 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
256c0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
256d0 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
256e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
256f0 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
25700 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
25710 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
25720 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
25730 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
25740 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25750 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
25760 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
25770 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
25780 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
25790 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 0);.         
257a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
257b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
257c0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
257d0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
257e0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
257f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25800 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
25810 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
25820 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65  e(nCell, pCellKe
25830 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
25840 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25850 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
25860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
25870 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
25880 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
25890 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
258a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
258b0 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
258c0 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
258d0 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
258e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
258f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25900 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
25910 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
25920 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
25930 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
25940 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
25950 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25960 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
25970 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
25980 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
25990 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
259a0 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
259b0 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
259c0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
259d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
259e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
259f0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
25a00 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
25a10 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  2);.    }.    as
25a20 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
25a30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
25a40 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
25a50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
25a60 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68  leaf ){.      ch
25a70 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ldPg = 0;.    }e
25a80 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61  lse if( lwr>=pPa
25a90 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
25aa0 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
25ab0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
25ac0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
25ad0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
25ae0 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67  se{.      chldPg
25af0 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
25b00 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29  Cell(pPage, lwr)
25b10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
25b20 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20   chldPg==0 ){.  
25b30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25b40 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25b50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
25b60 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25b70 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 2a  nCell );.      *
25b80 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
25b90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25ba0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
25bb0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
25bc0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
25bd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
25be0 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70 43 75  u16)lwr;.    pCu
25bf0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
25c00 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
25c10 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  idNKey = 0;.    
25c20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
25c30 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
25c40 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
25c50 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
25c60 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
25c70 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  sh:.  return rc;
25c80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
25c90 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75  n TRUE if the cu
25ca0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
25cb0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
25cc0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
25cd0 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62  *.** TRUE will b
25ce0 65 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72  e returned after
25cf0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
25d00 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f  e3BtreeNext() mo
25d10 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20  ves.** past the 
25d20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
25d30 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74  e table or sqlit
25d40 65 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f  e3BtreePrev() mo
25d50 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20  ves past.** the 
25d60 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52  first entry.  TR
25d70 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  UE is also retur
25d80 6e 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65  ned if the table
25d90 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
25da0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f  t sqlite3BtreeEo
25db0 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  f(BtCursor *pCur
25dc0 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68  ){.  /* TODO: Wh
25dd0 61 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  at if the cursor
25de0 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45   is in CURSOR_RE
25df0 51 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c  QUIRESEEK but al
25e00 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a  l table entries.
25e10 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64    ** have been d
25e20 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49  eleted? This API
25e30 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68   will need to ch
25e40 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61  ange to return a
25e50 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a  n error code.  *
25e60 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  * as well as the
25e70 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20   boolean result 
25e80 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  value..  */.  re
25e90 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c  turn (CURSOR_VAL
25ea0 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID!=pCur->eState
25eb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  );.}../*.** Adva
25ec0 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
25ed0 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
25ee0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
25ef0 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
25f00 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
25f10 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
25f20 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
25f30 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
25f40 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
25f50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
25f60 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f  efore.** this ro
25f70 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
25f80 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  , then set *pRes
25f90 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  =1..*/.int sqlit
25fa0 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
25fb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
25fc0 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
25fd0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d  ;.  int idx;.  M
25fe0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
25ff0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
26000 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
26010 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
26020 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
26030 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
26040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26050 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26060 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  }.  assert( pRes
26070 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43 55 52  !=0 );.  if( CUR
26080 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
26090 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
260a0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
260b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
260c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
260d0 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a  ->skipNext>0 ){.
260e0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
260f0 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65  xt = 0;.    *pRe
26100 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  s = 0;.    retur
26110 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
26120 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  .  pCur->skipNex
26130 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  t = 0;..  pPage 
26140 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
26150 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
26160 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
26170 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
26180 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
26190 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
261a0 73 65 72 74 28 20 69 64 78 3c 3d 70 50 61 67 65  sert( idx<=pPage
261b0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43  ->nCell );..  pC
261c0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
261d0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
261e0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28  dNKey = 0;.  if(
261f0 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
26200 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
26210 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
26220 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
26230 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
26240 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
26250 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
26260 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
26270 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
26280 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  c;.      rc = mo
26290 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
262a0 72 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20  r);.      *pRes 
262b0 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
262c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
262d0 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
262e0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
262f0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
26300 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
26310 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
26320 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
26330 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26340 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
26350 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
26360 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
26370 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
26380 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
26390 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
263a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
263b0 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
263c0 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  l );.    *pRes =
263d0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
263e0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
263f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
26400 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
26410 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
26420 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26430 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
26440 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
26450 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69    *pRes = 0;.  i
26460 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
26470 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
26480 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
26490 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
264a0 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  t(pCur);.  retur
264b0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
264c0 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
264d0 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
264e0 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
264f0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
26500 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73  e.  If.** succes
26510 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70  sful then set *p
26520 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63  Res=0.  If the c
26530 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72  ursor.** was alr
26540 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
26550 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
26560 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
26570 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
26580 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
26590 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
265a0 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
265b0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
265c0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
265d0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
265e0 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
265f0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
26600 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
26610 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
26620 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
26630 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
26640 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
26650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
26660 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
26670 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b  Cur->atLast = 0;
26680 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
26690 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
266a0 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
266b0 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
266c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
266d0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
266e0 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 70 43  Next<0 ){.    pC
266f0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
26700 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
26710 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26720 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
26730 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
26740 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
26750 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26760 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
26770 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
26780 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
26790 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
267a0 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
267b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  x[pCur->iPage];.
267c0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
267d0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
267e0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
267f0 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
26800 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
26820 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
26830 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
26840 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
26850 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
26860 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
26870 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
26880 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
26890 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
268a0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
268b0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
268c0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
268d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
268e0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
268f0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
26900 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
26910 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
26920 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
26930 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a  validNKey = 0;..
26940 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
26950 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
26960 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
26970 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26980 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70  Page];.    if( p
26990 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20  Page->intKey && 
269a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
269b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
269c0 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
269d0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
269e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
269f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
26a00 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20    }.  }.  *pRes 
26a10 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
26a20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
26a30 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 66  ate a new page f
26a40 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
26a50 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
26a60 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61 72   new page is mar
26a70 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20 28  ked as dirty.  (
26a80 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
26a90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26aa0 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61  e().** has alrea
26ab0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  dy been called o
26ac0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29  n the new page.)
26ad0 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 68    The new page h
26ae0 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20  as also.** been 
26af0 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74  referenced and t
26b00 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
26b10 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ne is responsibl
26b20 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a  e for calling.**
26b30 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
26b40 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20  ef() on the new 
26b50 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73 20  page when it is 
26b60 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  done..**.** SQLI
26b70 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
26b80 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41  d on success.  A
26b90 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20  ny other return 
26ba0 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a  value indicates.
26bb0 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70  ** an error.  *p
26bc0 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f  pPage and *pPgno
26bd0 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69   are undefined i
26be0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
26bf0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e  n error..** Do n
26c00 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ot invoke sqlite
26c10 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
26c20 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e 20 65   *ppPage if an e
26c30 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
26c40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
26c50 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
26c60 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
26c70 20 61 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f   a (feeble) effo
26c80 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a  rt is made to .*
26c90 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  * locate a page 
26ca0 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67  close to the pag
26cb0 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79  e number "nearby
26cc0 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  ".  This can be 
26cd0 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74  used in an.** at
26ce0 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65  tempt to keep re
26cf0 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73  lated pages clos
26d00 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20  e to each other 
26d10 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
26d20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69  file,.** which i
26d30 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20  n turn can make 
26d40 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20  database access 
26d50 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  faster..**.** If
26d60 20 74 68 65 20 22 65 78 61 63 74 22 20 70 61 72   the "exact" par
26d70 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
26d80 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75   and the page-nu
26d90 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78 69 73  mber nearby exis
26da0 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20  ts .** anywhere 
26db0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
26dc0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61  , then it is gua
26dd0 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65  renteed to be re
26de0 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20  turned. This.** 
26df0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
26e00 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
26e10 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63  bases when alloc
26e20 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c  ating a new tabl
26e30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26e40 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
26e50 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
26e60 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20  pBt, .  MemPage 
26e70 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e  **ppPage, .  Pgn
26e80 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e  o *pPgno, .  Pgn
26e90 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65  o nearby,.  u8 e
26ea0 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  xact.){.  MemPag
26eb0 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
26ec0 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20   rc;.  u32 n;   
26ed0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
26ee0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
26ef0 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b  list */.  u32 k;
26f00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26f10 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20  f leaves on the 
26f20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65  trunk of the fre
26f30 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  elist */.  MemPa
26f40 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a  ge *pTrunk = 0;.
26f50 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76    MemPage *pPrev
26f60 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e  Trunk = 0;.  Pgn
26f70 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a  o mxPage;     /*
26f80 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74   Total size of t
26f90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26fa0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
26fb0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
26fc0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
26fd0 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
26fe0 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
26ff0 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
27000 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d 20 67  nt(pBt);.  n = g
27010 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
27020 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
27030 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
27040 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e  ge-1 );.  if( n>
27050 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72  =mxPage ){.    r
27060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
27070 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
27080 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
27090 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
270a0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
270b0 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
270c0 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
270d0 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
270e0 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
270f0 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
27100 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
27110 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
27120 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
27130 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68     .    /* If th
27140 65 20 27 65 78 61 63 74 27 20 70 61 72 61 6d 65  e 'exact' parame
27150 74 65 72 20 77 61 73 20 74 72 75 65 20 61 6e 64  ter was true and
27160 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
27170 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
27180 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
27190 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
271a0 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
271b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
271c0 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
271d0 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
271e0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
271f0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
27200 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
27210 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
27220 0a 20 20 20 20 69 66 28 20 65 78 61 63 74 20 26  .    if( exact &
27230 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  & nearby<=mxPage
27240 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
27250 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
27260 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
27270 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
27280 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
27290 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
272a0 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
272b0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
272c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
272d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28  rn rc;.      if(
272e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
272f0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
27300 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
27310 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
27320 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79   *pPgno = nearby
27330 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
27340 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
27350 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
27360 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
27370 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
27380 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
27390 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
273a0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
273b0 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
273c0 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
273d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
273e0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
273f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
27400 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
27410 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
27420 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
27430 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
27440 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
27450 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
27460 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
27470 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
27480 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
27490 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
274a0 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
274b0 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
274c0 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
274d0 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
274e0 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
274f0 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
27500 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cated..    */.  
27510 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
27520 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
27530 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
27540 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
27550 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
27560 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
27570 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
27580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27590 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
275a0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
275b0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
275c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
275d0 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  iTrunk==mxPage )
275e0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72 75  ;.      if( iTru
275f0 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  nk>mxPage ){.   
27600 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27610 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27630 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
27640 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
27650 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
27660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27670 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
27680 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
27690 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
276a0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
276b0 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
276c0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
276d0 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23  >aData[4]); /* #
276e0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
276f0 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  is trunk page */
27700 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
27710 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
27720 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
27730 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
27740 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
27750 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
27760 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
27770 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
27780 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
27790 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
277a0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
277b0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
277c0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
277d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
277e0 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
277f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27800 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
27810 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
27820 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
27830 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
27840 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
27850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27860 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
27870 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
27880 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
27890 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
278a0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
278b0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
278c0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
278d0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
278e0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
278f0 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
27900 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
27910 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
27920 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
27930 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
27940 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
27950 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
27960 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
27970 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
27980 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
27990 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
279a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
279b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
279c0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
279d0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
279e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
279f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
27a00 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
27a10 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
27a20 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
27a30 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
27a40 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
27a50 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
27a60 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
27a70 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
27a80 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
27a90 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
27aa0 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
27ab0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27ac0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
27ad0 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
27ae0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
27af0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
27b00 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
27b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27b20 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
27b30 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
27b40 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
27b50 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
27b60 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
27b70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27b80 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
27b90 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
27ba0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
27bb0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
27bc0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
27bd0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
27be0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
27bf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27c00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
27c10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
27c20 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
27c30 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27c40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27c50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
27c60 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
27c70 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
27c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27c90 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
27ca0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
27cb0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
27cc0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
27cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
27ce0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
27cf0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
27d00 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
27d10 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
27d20 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
27d30 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
27d40 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
27d50 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
27d60 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
27d70 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
27d80 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
27d90 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
27da0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
27db0 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
27dc0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
27dd0 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
27de0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
27df0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
27e00 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
27e10 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
27e20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27e30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27e40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
27e50 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
27e60 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
27e70 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
27e80 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
27e90 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
27ea0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
27eb0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  etPage(pBt, iNew
27ec0 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
27ed0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
27ee0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27ef0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
27f00 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
27f10 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
27f20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
27f30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27f40 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
27f50 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
27f60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
27f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27f80 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
27f90 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
27fa0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
27fb0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
27fc0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
27fd0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
27fe0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
27ff0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
28000 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
28010 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
28020 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
28030 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
28040 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
28050 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
28060 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
28070 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
28080 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
28090 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
280a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
280b0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
280c0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
280d0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
280e0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
280f0 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
28100 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
28110 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
28120 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
28130 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
28140 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28160 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
28170 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
28180 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
28190 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
281a0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
281b0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
281c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
281d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
281e0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
281f0 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
28200 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
28220 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
28230 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
28240 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
28250 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
28260 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
28270 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
28280 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30     }else if( k>0
28290 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
282a0 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
282b0 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
282c0 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73          u32 clos
282d0 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
282e0 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
282f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
28300 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
28310 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69  aData;.        i
28320 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
28330 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
28340 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
28350 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
28360 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
28370 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
28380 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
28390 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
283a0 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
283b0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
283c0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
283d0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
283e0 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
283f0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
28400 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  i*4]) - nearby);
28410 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28420 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
28430 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
28440 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
28450 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
28460 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28490 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
284a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
284b0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
284c0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
284d0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
284e0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
284f0 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
28500 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
28510 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
28520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
28530 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
28540 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
28550 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
28560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28570 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
28580 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
28590 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
285a0 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65  ist || iPage==ne
285b0 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
285c0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
285d0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
285e0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
285f0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
28600 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
28610 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
28620 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
28630 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
28640 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
28650 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
28660 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
28670 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
28680 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
28690 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
286a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
286b0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
286c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
286d0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
286e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
286f0 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
28700 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
28710 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
28720 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
28730 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
28740 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
28750 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
28760 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
28770 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
28780 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
28790 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
287a0 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20  pBt, *pPgno);.  
287b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
287c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
287d0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
287e0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
287f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28810 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
28820 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
28830 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
28840 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
28850 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
28870 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
28880 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
28890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
288a0 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
288b0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
288c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
288d0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
288e0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
288f0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
28900 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
28910 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
28920 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
28930 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
28940 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
28950 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  so create a new 
28960 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20  page at the.    
28970 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
28980 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  le */.    rc = s
28990 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
289a0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
289b0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
289c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
289d0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
289e0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
289f0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
28a00 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
28a10 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
28a20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28a30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
28a40 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
28a50 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
28a60 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
28a70 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
28a80 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
28a90 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
28aa0 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
28ab0 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
28ac0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
28ad0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
28ae0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
28af0 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
28b00 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
28b10 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
28b20 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
28b30 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
28b40 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
28b50 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
28b60 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
28b70 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
28b80 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
28b90 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
28ba0 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
28bb0 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
28bc0 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
28bd0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
28be0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
28bf0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
28c00 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
28c10 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  age(pBt, pBt->nP
28c20 61 67 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  age, &pPg, 1);. 
28c30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28c40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28c50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28c60 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
28c70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28c80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
28c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28ca0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
28cb0 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
28cc0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
28cd0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
28ce0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
28cf0 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
28d00 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
28d10 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
28d20 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
28d30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
28d40 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
28d50 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
28d60 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
28d70 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
28d80 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
28d90 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
28da0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
28db0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
28dc0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  1);.    if( rc )
28dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
28de0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28df0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
28e00 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28e10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28e20 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
28e30 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
28e40 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
28e50 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
28e60 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
28e70 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
28e80 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
28e90 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
28ea0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
28eb0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
28ec0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
28ed0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
28ee0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
28ef0 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  unk);.  if( rc==
28f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28f10 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
28f20 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
28f30 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
28f40 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
28f50 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
28f60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28f70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
28f80 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
28f90 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
28fa0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
28fb0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
28fc0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
28fd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
28fe0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
28ff0 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29  teable((*ppPage)
29000 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
29010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29020 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
29030 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
29040 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
29050 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29060 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
29070 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
29080 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
29090 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
290a0 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
290b0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
290c0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
290d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
290e0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
290f0 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
29100 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
29110 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
29120 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29130 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
29140 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
29150 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
29160 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
29170 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
29180 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
29190 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
291a0 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
291b0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
291c0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
291d0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
291e0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
291f0 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
29200 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
29210 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
29220 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
29230 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
29240 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
29250 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
29260 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
29270 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
29280 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
29290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
292a0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
292b0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
292c0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
292d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
292e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
292f0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
29300 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
29310 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
29320 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
29330 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
29340 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
29350 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29370 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
29380 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
29390 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
293a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
293c0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
293d0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
293e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293f0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
29400 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
29410 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
29420 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
29430 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29440 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
29450 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20  assert( iPage>1 
29460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
29470 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
29480 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
29490 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  );..  if( pMemPa
294a0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
294b0 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
294c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
294d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
294e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
294f0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
29500 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
29510 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
29520 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
29530 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
29540 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
29550 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29560 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
29570 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
29580 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
29590 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
295a0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
295b0 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
295c0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
295d0 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
295e0 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65  ;..  if( pBt->se
295f0 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
29600 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75    /* If the secu
29610 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e  re_delete option
29620 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
29630 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  n.    ** always 
29640 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
29650 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
29660 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
29670 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
29680 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d  !pPage && ((rc =
29690 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
296a0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
296b0 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20  , 0))!=0) ).    
296c0 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
296d0 28 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 50 61 67 65 2d 3e 70  erWrite(pPage->p
296f0 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20  DbPage))!=0).   
29700 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
29710 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
29720 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
29730 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
29740 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
29750 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
29760 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
29770 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
29780 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
29790 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
297a0 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
297b0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
297c0 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
297d0 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
297e0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70  OVACUUM ){.    p
297f0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50  trmapPut(pBt, iP
29800 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
29810 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20  PAGE, 0, &rc);. 
29820 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29830 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
29840 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e   }..  /* Now man
29850 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75  ipulate the actu
29860 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65  al database free
29870 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  -list structure.
29880 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20   There are two. 
29890 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65   ** possibilitie
298a0 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  s. If the free-l
298b0 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ist is currently
298c0 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68   empty, or if th
298d0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75  e first.  ** tru
298e0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
298f0 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
29900 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
29910 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20   will become a. 
29920 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73   ** new free-lis
29930 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74  t trunk page. Ot
29940 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
29950 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f   become a leaf o
29960 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  f the.  ** first
29970 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
29980 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d  he current free-
29990 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  list. This block
299a0 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a   tests if it.  *
299b0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
299c0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73   add the page as
299d0 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
299e0 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66   leaf..  */.  if
299f0 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20  ( nFree!=0 ){.  
29a00 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20    u32 nLeaf;    
29a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
29a20 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
29a30 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74   leaf cells on t
29a40 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20  runk page */..  
29a50 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
29a60 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
29a70 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20  ta[32]);.    rc 
29a80 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
29a90 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
29aa0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
29ab0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29ac0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
29ad0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
29ae0 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65  ..    nLeaf = ge
29af0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
29b00 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61  aData[4]);.    a
29b10 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
29b20 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20  leSize>32 );.   
29b30 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33   if( nLeaf > (u3
29b40 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
29b50 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20  e/4 - 2 ){.     
29b60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
29b70 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
29b80 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
29b90 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
29ba0 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70  ( nLeaf < (u32)p
29bb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
29bc0 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
29bd0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
29be0 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74  ere is room on t
29bf0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f  he trunk page to
29c00 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65   insert the page
29c10 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
29c20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c  freed as a new l
29c30 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eaf..      **.  
29c40 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
29c50 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
29c60 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75  is not really fu
29c70 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74  ll until it cont
29c80 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ains.      ** us
29c90 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65  ableSize/4 - 2 e
29ca0 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62  ntries, not usab
29cb0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
29cc0 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a  ries as we have.
29cd0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20        ** coded. 
29ce0 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f   But due to a co
29cf0 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65  ding error in ve
29d00 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
29d10 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20   prior to.      
29d20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61  ** 3.6.0, databa
29d30 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73  ses with freelis
29d40 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f  t trunk pages ho
29d50 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a  lding more than.
29d60 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
29d70 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
29d80 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
29d90 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20  ed as corrupt.  
29da0 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  In order.      *
29db0 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61  * to maintain ba
29dc0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
29dd0 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
29de0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
29df0 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65  ite,.      ** we
29e00 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
29e10 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
29e20 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
29e30 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
29e40 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
29e50 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
29e60 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
29e70 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
29e80 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
29e90 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
29ea0 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
29eb0 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
29ec0 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
29ed0 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
29ee0 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
29ef0 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
29f00 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
29f10 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
29f20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
29f30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29f40 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
29f50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
29f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29f70 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
29f80 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
29f90 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
29fa0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
29fb0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
29fc0 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
29fd0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29fe0 65 20 26 26 20 21 70 42 74 2d 3e 73 65 63 75 72  e && !pBt->secur
29ff0 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  eDelete ){.     
2a000 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2a010 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
2a020 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2a030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2a040 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
2a050 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
2a060 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a070 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
2a080 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
2a090 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
2a0a0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
2a0b0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
2a0c0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2a0d0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
2a0e0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
2a0f0 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
2a100 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
2a110 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2a120 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
2a130 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2a140 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
2a150 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
2a160 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2a170 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
2a180 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
2a190 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
2a1a0 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
2a1b0 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
2a1c0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
2a1d0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2a1e0 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
2a1f0 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
2a200 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
2a210 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
2a220 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
2a230 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2a240 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2a250 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
2a260 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
2a270 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2a280 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
2a290 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  )) ){.    goto f
2a2a0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
2a2b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2a2c0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2a2d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
2a2e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a2f0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
2a300 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
2a310 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
2a320 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
2a330 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2a340 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
2a350 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2a360 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2a370 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
2a380 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
2a390 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
2a3a0 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
2a3b0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
2a3c0 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
2a3d0 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
2a3e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
2a3f0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
2a400 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2a410 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
2a420 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
2a430 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2a440 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28  c void freePage(
2a450 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2a460 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
2a470 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
2a480 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
2a490 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
2a4a0 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
2a4b0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
2a4c0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
2a4d0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2a4e0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2a4f0 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
2a500 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2a510 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
2a520 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
2a530 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
2a540 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2a550 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2a560 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2a570 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
2a580 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2a590 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66  nOvfl;.  u32 ovf
2a5a0 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
2a5b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a5c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2a5d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2a5e0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2a5f0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2a600 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
2a610 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
2a620 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2a630 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
2a640 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2a650 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
2a660 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
2a670 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
2a680 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
2a690 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
2a6a0 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w]);.  assert( p
2a6b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
2a6c0 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
2a6d0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
2a6e0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
2a6f0 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
2a700 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
2a710 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
2a720 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
2a730 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
2a740 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
2a750 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
2a760 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
2a770 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
2a780 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
2a790 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
2a7a0 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f   ovflPgno<2 || o
2a7b0 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67  vflPgno>btreePag
2a7c0 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
2a7d0 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74       /* 0 is not
2a7e0 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75   a legal page nu
2a7f0 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20  mber and page 1 
2a800 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20  cannot be an .  
2a810 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
2a820 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20  page. Therefore 
2a830 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72  if ovflPgno<2 or
2a840 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2a850 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66   the .      ** f
2a860 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ile the database
2a870 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
2a880 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
2a890 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2a8a0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
2a8b0 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20   if( nOvfl ){.  
2a8c0 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
2a8d0 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76  flowPage(pBt, ov
2a8e0 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20  flPgno, &pOvfl, 
2a8f0 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69  &iNext);.      i
2a900 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2a910 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  c;.    }..    if
2a920 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70  ( ( pOvfl || ((p
2a930 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65  Ovfl = btreePage
2a940 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c  Lookup(pBt, ovfl
2a950 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20  Pgno))!=0) ).   
2a960 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
2a970 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f  rPageRefcount(pO
2a980 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31  vfl->pDbPage)!=1
2a990 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
2a9a0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61   There is no rea
2a9b0 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73  son any cursor s
2a9c0 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75  hould have an ou
2a9d0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
2a9e0 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  nce .      ** to
2a9f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
2aa00 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
2aa10 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65   cell that is be
2aa20 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61  ing deleted/upda
2aa30 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f  ted..      ** So
2aa40 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73   if there exists
2aa50 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
2aa60 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73  eference to this
2aa70 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a   page, then it .
2aa80 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f        ** must no
2aa90 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f  t really be an o
2aaa0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64  verflow page and
2aab0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
2aac0 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a  st be corrupt. .
2aad0 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68        ** It is h
2aae0 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74  elpful to detect
2aaf0 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c   this before cal
2ab00 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29  ling freePage2()
2ab10 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  , as .      ** f
2ab20 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a  reePage2() may z
2ab30 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ero the page con
2ab40 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d  tents if secure-
2ab50 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20  delete mode is. 
2ab60 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e       ** enabled.
2ab70 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c   If this 'overfl
2ab80 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73  ow' page happens
2ab90 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68   to be a page th
2aba0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
2abb0 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74  caller is iterat
2abc0 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75  ing through or u
2abd0 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68  sing in some oth
2abe0 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20  er way, this.   
2abf0 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f     ** can be pro
2ac00 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20  blematic..      
2ac10 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  */.      rc = SQ
2ac20 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2ac30 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
2ac40 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
2ac50 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f  e2(pBt, pOvfl, o
2ac60 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a  vflPgno);.    }.
2ac70 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29  .    if( pOvfl )
2ac80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
2ac90 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d  agerUnref(pOvfl-
2aca0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
2acb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2acc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66  turn rc;.    ovf
2acd0 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20  lPgno = iNext;. 
2ace0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2acf0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2ad00 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
2ad10 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
2ad20 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
2ad30 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
2ad40 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
2ad50 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
2ad60 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
2ad70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
2ad80 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
2ad90 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
2ada0 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
2adb0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
2adc0 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
2add0 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
2ade0 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
2adf0 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
2ae00 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
2ae10 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
2ae20 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
2ae30 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
2ae40 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
2ae50 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
2ae60 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
2ae70 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
2ae80 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
2ae90 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
2aea0 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
2aeb0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
2aec0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
2aed0 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
2aee0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
2aef0 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
2af00 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
2af10 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
2af20 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
2af30 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
2af40 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2af50 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
2af60 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
2af70 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
2af80 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
2af90 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
2afa0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2afb0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2afc0 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
2afd0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
2afe0 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
2aff0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
2b000 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
2b010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
2b020 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
2b030 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
2b040 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
2b050 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
2b060 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2b070 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
2b080 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
2b090 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
2b0a0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
2b0b0 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
2b0c0 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
2b0d0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
2b0e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
2b0f0 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
2b100 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
2b110 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
2b120 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
2b130 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b140 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2b150 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
2b160 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
2b170 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
2b180 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
2b190 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2b1a0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2b1b0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
2b1c0 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
2b1d0 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
2b1e0 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
2b1f0 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
2b200 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
2b210 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
2b220 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
2b230 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
2b240 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
2b250 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
2b260 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
2b270 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
2b280 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
2b290 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2b2a0 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2b2b0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2b2c0 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
2b2d0 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
2b2e0 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
2b2f0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2b300 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
2b310 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
2b320 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
2b330 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
2b340 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
2b350 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
2b360 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
2b370 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
2b380 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
2b390 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
2b3a0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
2b3b0 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
2b3c0 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
2b3d0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2b3e0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
2b3f0 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
2b400 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
2b410 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
2b420 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
2b430 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
2b440 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65  =(u32)(nData+nZe
2b450 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ro) );.  .  /* F
2b460 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
2b470 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
2b480 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
2b490 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
2b4a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
2b4b0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
2b4c0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2b4d0 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
2b4e0 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20 4e 45  lse{ .    if( NE
2b4f0 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66 66 66  VER(nKey>0x7ffff
2b500 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 29 20  fff || pKey==0) 
2b510 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2b520 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b530 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2b540 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74 29  Payload += (int)
2b550 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d  nKey;.    pSrc =
2b560 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20   pKey;.    nSrc 
2b570 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d  = (int)nKey;.  }
2b580 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
2b590 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
2b5a0 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
2b5b0 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
2b5c0 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
2b5d0 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
2b5e0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
2b5f0 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
2b600 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
2b610 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
2b620 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
2b630 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2b640 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
2b650 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
2b660 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
2b670 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
2b680 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
2b690 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
2b6a0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2b6b0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
2b6c0 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
2b6d0 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
2b6e0 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
2b6f0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
2b700 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
2b710 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
2b720 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
2b730 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
2b740 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
2b750 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2b760 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
2b770 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
2b780 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
2b790 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2b7a0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
2b7b0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
2b7c0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
2b7d0 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
2b7e0 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
2b7f0 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
2b800 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
2b810 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
2b820 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
2b830 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2b840 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
2b850 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
2b860 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2b870 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
2b880 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
2b890 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
2b8a0 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
2b8b0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
2b8c0 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
2b8d0 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
2b8e0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
2b8f0 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
2b900 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
2b910 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
2b920 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
2b930 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
2b940 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
2b950 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
2b960 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c  ninitialised val
2b970 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
2b980 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
2b990 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
2b9a0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
2b9b0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2b9c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
2b9d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b9e0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
2b9f0 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
2ba00 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
2ba10 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
2ba20 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
2ba30 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2ba40 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
2ba50 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
2ba60 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2ba70 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
2ba80 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
2ba90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2baa0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
2bab0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2bac0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
2bad0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
2bae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2baf0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
2bb00 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
2bb10 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
2bb20 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
2bb30 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
2bb40 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
2bb50 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
2bb60 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
2bb70 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
2bb80 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
2bb90 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
2bba0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
2bbb0 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
2bbc0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
2bbd0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
2bbe0 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
2bbf0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
2bc00 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
2bc10 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
2bc20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
2bc30 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
2bc40 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
2bc50 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
2bc60 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
2bc70 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2bc80 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2bc90 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2bca0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2bcb0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2bcc0 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
2bcd0 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
2bce0 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
2bcf0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2bd00 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
2bd10 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
2bd20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
2bd30 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
2bd40 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
2bd50 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
2bd60 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
2bd70 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
2bd80 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
2bd90 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
2bda0 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
2bdb0 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
2bdc0 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
2bdd0 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
2bde0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
2bdf0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
2be00 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
2be10 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
2be20 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
2be30 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
2be40 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
2be50 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
2be60 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
2be70 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
2be80 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
2be90 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
2bea0 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
2beb0 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
2bec0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
2bed0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
2bee0 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
2bef0 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
2bf00 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
2bf10 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
2bf20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
2bf30 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
2bf40 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
2bf50 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
2bf60 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
2bf70 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
2bf80 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2bf90 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2bfa0 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
2bfb0 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
2bfc0 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
2bfd0 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
2bfe0 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
2bff0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
2c000 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
2c010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
2c020 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
2c030 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
2c040 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
2c050 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
2c060 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
2c070 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
2c080 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
2c090 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
2c0a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
2c0b0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
2c0c0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2c0d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
2c0e0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
2c0f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
2c100 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2c110 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
2c120 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
2c130 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
2c140 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
2c150 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
2c160 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
2c170 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
2c180 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
2c190 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
2c1a0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
2c1b0 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
2c1c0 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
2c1d0 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
2c1e0 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
2c1f0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
2c200 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
2c210 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
2c220 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
2c230 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
2c240 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
2c250 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
2c260 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
2c270 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
2c280 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
2c290 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
2c2a0 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
2c2b0 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
2c2c0 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
2c2d0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
2c2e0 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
2c2f0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
2c300 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
2c310 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
2c320 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
2c330 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74 72 3b 20  /.  u8 *endPtr; 
2c340 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 6f      /* End of lo
2c350 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  op */.  int rc; 
2c360 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2c370 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2c380 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
2c390 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20  /* Beginning of 
2c3a0 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d  the header.  0 m
2c3b0 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20  ost pages.  100 
2c3c0 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28  page 1 */..  if(
2c3d0 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
2c3e0 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
2c3f0 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
2c400 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
2c410 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  t( sz==cellSize(
2c420 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
2c430 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c440 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c450 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2c460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2c470 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2c480 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2c490 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
2c4a0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
2c4b0 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
2c4c0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
2c4d0 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
2c4e0 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
2c4f0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
2c500 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
2c510 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
2c520 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
2c530 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
2c540 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
2c550 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2c560 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29 67   if( pc < (u32)g
2c570 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2c580 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e  r+5]) || pc+sz >
2c590 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2c5a0 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a  bleSize ){.    *
2c5b0 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRC = SQLITE_COR
2c5c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72  RUPT_BKPT;.    r
2c5d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  eturn;.  }.  rc 
2c5e0 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67  = freeSpace(pPag
2c5f0 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66  e, pc, sz);.  if
2c600 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43  ( rc ){.    *pRC
2c610 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2c620 6e 3b 0a 20 20 7d 0a 20 20 65 6e 64 50 74 72 20  n;.  }.  endPtr 
2c630 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
2c640 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
2c650 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 32 5d 3b  age->nCell - 2];
2c660 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49  .  assert( (SQLI
2c670 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74  TE_PTR_TO_INT(pt
2c680 72 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20  r)&1)==0 );  /* 
2c690 70 74 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d  ptr is always 2-
2c6a0 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a  byte aligned */.
2c6b0 20 20 77 68 69 6c 65 28 20 70 74 72 3c 65 6e 64    while( ptr<end
2c6c0 50 74 72 20 29 7b 0a 20 20 20 20 2a 28 75 31 36  Ptr ){.    *(u16
2c6d0 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29 26  *)ptr = *(u16*)&
2c6e0 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 20  ptr[2];.    ptr 
2c6f0 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 50 61 67  += 2;.  }.  pPag
2c700 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75  e->nCell--;.  pu
2c710 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2c720 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
2c730 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
2c740 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  ee += 2;.}../*.*
2c750 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
2c760 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
2c770 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
2c780 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
2c790 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
2c7a0 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
2c7b0 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
2c7c0 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
2c7d0 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
2c7e0 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
2c7f0 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
2c800 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
2c810 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
2c820 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
2c830 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
2c840 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
2c850 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
2c860 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
2c870 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
2c880 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d  n pPage->aOvfl[]
2c890 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
2c8a0 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
2c8b0 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
2c8c0 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
2c8d0 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
2c8e0 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
2c8f0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
2c900 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
2c910 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
2c920 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
2c930 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
2c940 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
2c950 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
2c960 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
2c970 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
2c980 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
2c990 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
2c9a0 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
2c9b0 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
2c9c0 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
2c9d0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
2c9e0 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
2c9f0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
2ca00 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
2ca10 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
2ca20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
2ca30 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
2ca40 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
2ca50 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
2ca60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2ca70 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
2ca80 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2ca90 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
2caa0 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
2cab0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
2cac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2cad0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
2cae0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
2caf0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
2cb00 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
2cb10 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
2cb20 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
2cb30 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
2cb40 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
2cb50 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
2cb60 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
2cb70 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
2cb80 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
2cb90 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
2cba0 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
2cbb0 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
2cbc0 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
2cbd0 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
2cbe0 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
2cbf0 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
2cc00 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
2cc10 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
2cc20 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
2cc30 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
2cc40 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
2cc50 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
2cc60 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
2cc70 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
2cc80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2cc90 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
2cca0 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
2ccb0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
2ccc0 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
2ccd0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
2cce0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
2ccf0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
2cd00 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
2cd10 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
2cd20 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
2cd30 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
2cd40 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
2cd50 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
2cd60 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
2cd70 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
2cd80 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2cd90 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2cda0 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
2cdb0 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20  u8 *ptr;        
2cdc0 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d 6f    /* Used for mo
2cdd0 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ving information
2cde0 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61 5b   around in data[
2cdf0 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74  ] */.  u8 *endPt
2ce00 72 3b 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  r;       /* End 
2ce10 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 0a  of the loop */..
2ce20 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69    int nSkip = (i
2ce30 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a  Child ? 4 : 0);.
2ce40 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
2ce50 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
2ce60 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
2ce70 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
2ce80 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
2ce90 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2cea0 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
2ceb0 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43  ge->pBt) && MX_C
2cec0 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
2ced0 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
2cee0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2cef0 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
2cf00 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29 3b  pPage->aOvfl) );
2cf10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2cf20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2cf30 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2cf40 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c   );.  /* The cel
2cf50 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  l should normall
2cf60 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65  y be sized corre
2cf70 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20  ctly.  However, 
2cf80 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20  when moving a.  
2cf90 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c  ** malformed cel
2cfa0 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61  l from a leaf pa
2cfb0 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f  ge to an interio
2cfc0 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63  r page, if the c
2cfd0 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61  ell size.  ** wa
2cfe0 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  nted to be less 
2cff0 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72  than 4 but got r
2d000 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f  ounded up to 4 o
2d010 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e  n the leaf, then
2d020 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74   size.  ** might
2d030 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20   be less than 8 
2d040 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69  (leaf-size + poi
2d050 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74  nter) on the int
2d060 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e  erior node.  Hen
2d070 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d  ce.  ** the term
2d080 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e   after the || in
2d090 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
2d0a0 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73  ssert(). */.  as
2d0b0 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
2d0c0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2d0d0 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26  ll) || (sz==8 &&
2d0e0 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20   iChild>0) );.  
2d0f0 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
2d100 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61  flow || sz+2>pPa
2d110 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  ge->nFree ){.   
2d120 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20   if( pTemp ){.  
2d130 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2d140 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53  +nSkip, pCell+nS
2d150 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
2d160 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
2d170 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
2d180 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2d190 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
2d1a0 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
2d1b0 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
2d1c0 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
2d1d0 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
2d1e0 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
2d1f0 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  aOvfl)/sizeof(pP
2d200 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20  age->aOvfl[0])) 
2d210 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  );.    pPage->aO
2d220 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70  vfl[j].pCell = p
2d230 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
2d240 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20  >aOvfl[j].idx = 
2d250 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b  (u16)i;.  }else{
2d260 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71  .    int rc = sq
2d270 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d280 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2d290 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d2a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d2b0 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20  *pRC = rc;.     
2d2c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
2d2d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2d2e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2d2f0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2d300 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d  e) );.    data =
2d310 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
2d320 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20     cellOffset = 
2d330 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
2d340 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c  t;.    end = cel
2d350 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
2d360 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e  e->nCell;.    in
2d370 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  s = cellOffset +
2d380 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61   2*i;.    rc = a
2d390 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
2d3a0 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20  ge, sz, &idx);. 
2d3b0 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52     if( rc ){ *pR
2d3c0 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20  C = rc; return; 
2d3d0 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c  }.    /* The all
2d3e0 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75  ocateSpace() rou
2d3f0 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20  tine guarantees 
2d400 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  the following tw
2d410 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  o properties.   
2d420 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
2d430 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20  s success */.   
2d440 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
2d450 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73  end+2 );.    ass
2d460 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28  ert( idx+sz <= (
2d470 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
2d480 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2d490 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
2d4a0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
2d4b0 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20  ee -= (u16)(2 + 
2d4c0 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  sz);.    memcpy(
2d4d0 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d  &data[idx+nSkip]
2d4e0 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
2d4f0 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69 66  z-nSkip);.    if
2d500 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
2d510 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
2d520 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a  [idx], iChild);.
2d530 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20 3d 20      }.    ptr = 
2d540 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20 20  &data[end];.    
2d550 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b 69  endPtr = &data[i
2d560 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ns];.    assert(
2d570 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
2d580 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20 29  INT(ptr)&1)==0 )
2d590 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c 77  ;  /* ptr is alw
2d5a0 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67 6e  ays 2-byte align
2d5b0 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28  ed */.    while(
2d5c0 20 70 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a 20   ptr>endPtr ){. 
2d5d0 20 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20       *(u16*)ptr 
2d5e0 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d 32  = *(u16*)&ptr[-2
2d5f0 5d 3b 0a 20 20 20 20 20 20 70 74 72 20 2d 3d 20  ];.      ptr -= 
2d600 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  2;.    }.    put
2d610 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d  2byte(&data[ins]
2d620 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32  , idx);.    put2
2d630 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
2d640 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
2d650 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
2d660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2d670 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2d680 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
2d690 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
2d6a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
2d6b0 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
2d6c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
2d6d0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2d6e0 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
2d6f0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
2d700 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
2d710 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
2d720 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
2d730 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  /.      ptrmapPu
2d740 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20  tOvflPtr(pPage, 
2d750 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20  pCell, pRC);.   
2d760 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
2d770 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
2d780 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
2d790 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
2d7a0 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
2d7b0 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
2d7c0 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
2d7d0 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
2d7e0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
2d7f0 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
2d800 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
2d810 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
2d820 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
2d830 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
2d840 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
2d850 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
2d860 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
2d870 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
2d880 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
2d890 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
2d8a0 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
2d8b0 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
2d8c0 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
2d8d0 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
2d8e0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
2d8f0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2d900 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
2d910 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41 64  llptr;     /* Ad
2d920 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2d930 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
2d940 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20  int cellbody;   
2d950 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
2d960 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a  next cell body *
2d970 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
2d980 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2d990 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
2d9a0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61  /* Pointer to da
2d9b0 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f 0a  ta for pPage */.
2d9c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
2d9d0 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
2d9e0 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  et;           /*
2d9f0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
2da00 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  r on pPage */.  
2da10 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62 6c  const int nUsabl
2da20 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
2da30 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20 55  usableSize; /* U
2da40 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70 61  sable size of pa
2da50 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
2da60 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2da70 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
2da80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2da90 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2daa0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2dab0 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26 26  ert( nCell>=0 &&
2dac0 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58 5f   nCell<=(int)MX_
2dad0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2dae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2daf0 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50 61  (int)MX_CELL(pPa
2db00 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 29  ge->pBt)<=10921)
2db10 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2db20 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2db30 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2db40 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ge) );..  /* Che
2db50 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
2db60 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 7a   has just been z
2db70 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61 67  eroed by zeroPag
2db80 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e() */.  assert(
2db90 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2dba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65   );.  assert( ge
2dbb0 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64  t2byteNotZero(&d
2dbc0 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73  ata[hdr+5])==nUs
2dbd0 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c  able );..  pCell
2dbe0 70 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67  ptr = &data[pPag
2dbf0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
2dc00 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c  nCell*2];.  cell
2dc10 62 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a  body = nUsable;.
2dc20 20 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b    for(i=nCell-1;
2dc30 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
2dc40 20 75 31 36 20 73 7a 20 3d 20 61 53 69 7a 65 5b   u16 sz = aSize[
2dc50 69 5d 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72  i];.    pCellptr
2dc60 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65 6c 6c 62   -= 2;.    cellb
2dc70 6f 64 79 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 70  ody -= sz;.    p
2dc80 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72  ut2byte(pCellptr
2dc90 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20  , cellbody);.   
2dca0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65   memcpy(&data[ce
2dcb0 6c 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b  llbody], apCell[
2dcc0 69 5d 2c 20 73 7a 29 3b 0a 20 20 7d 0a 20 20 70  i], sz);.  }.  p
2dcd0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2dce0 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20  r+3], nCell);.  
2dcf0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2dd00 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  dr+5], cellbody)
2dd10 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
2dd20 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e   -= (nCell*2 + n
2dd30 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64  Usable - cellbod
2dd40 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65  y);.  pPage->nCe
2dd50 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b  ll = (u16)nCell;
2dd60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2dd70 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65  llowing paramete
2dd80 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  rs determine how
2dd90 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70   many adjacent p
2dda0 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65  ages get involve
2ddb0 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63  d.** in a balanc
2ddc0 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ing operation.  
2ddd0 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  NN is the number
2dde0 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   of neighbors on
2ddf0 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20   either side.** 
2de00 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74  of the page that
2de10 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2de20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70  the balancing op
2de30 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20  eration.  NB is 
2de40 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d  the.** total num
2de50 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61  ber of pages tha
2de60 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69  t participate, i
2de70 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72  ncluding the tar
2de80 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20  get page and.** 
2de90 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  NN neighbors on 
2dea0 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a  either side..**.
2deb0 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76  ** The minimum v
2dec0 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20  alue of NN is 1 
2ded0 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e  (of course).  In
2dee0 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76  creasing NN abov
2def0 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20  e 1.** (to 2 or 
2df00 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73  3) gives a modes
2df10 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  t improvement in
2df20 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45   SELECT and DELE
2df30 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a  TE performance.*
2df40 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f  * in exchange fo
2df50 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61  r a larger degra
2df60 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54  dation in INSERT
2df70 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66   and UPDATE perf
2df80 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
2df90 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65  value of NN appe
2dfa0 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20  ars to give the 
2dfb0 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65  best results ove
2dfc0 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rall..*/.#define
2dfd0 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20   NN 1           
2dfe0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
2dff0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
2e000 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  er side of pPage
2e010 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28   */.#define NB (
2e020 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20  NN*2+1)      /* 
2e030 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f  Total pages invo
2e040 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  lved in the bala
2e050 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66  nce */...#ifndef
2e060 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
2e070 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20  CKBALANCE./*.** 
2e080 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
2e090 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65  balance() handle
2e0a0 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65  s the common spe
2e0b0 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a  cial case where.
2e0c0 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ** a new entry i
2e0d0 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64  s being inserted
2e0e0 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20   on the extreme 
2e0f0 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65  right-end of the
2e100 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68  .** tree, in oth
2e110 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74  er words, when t
2e120 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c  he new entry wil
2e130 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72  l become the lar
2e140 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e  gest.** entry in
2e150 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a   the tree..**.**
2e160 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69   Instead of tryi
2e170 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65 20 74 68  ng to balance th
2e180 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
2e190 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
2e1a0 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
2e1b0 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
2e1c0 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
2e1d0 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
2e1e0 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
2e1f0 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
2e200 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
2e210 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
2e220 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
2e230 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
2e240 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
2e250 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
2e260 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
2e270 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
2e280 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
2e290 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
2e2a0 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
2e2b0 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
2e2c0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
2e2d0 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
2e2e0 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
2e2f0 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
2e300 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
2e310 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
2e320 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
2e330 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
2e340 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
2e350 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
2e360 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
2e370 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
2e380 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61  ..**.** The pSpa
2e390 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65  ce buffer is use
2e3a0 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d  d to store a tem
2e3b0 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74  porary copy of t
2e3c0 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65  he divider.** ce
2e3d0 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ll that will be 
2e3e0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50  inserted into pP
2e3f0 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65  arent. Such a ce
2e400 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
2e410 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20   4.** byte page 
2e420 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20  number followed 
2e430 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  by a variable le
2e440 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e  ngth integer. In
2e450 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
2e460 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65   at most 13 byte
2e470 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70  s. Hence the pSp
2e480 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  ace buffer must 
2e490 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31  be at.** least 1
2e4a0 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  3 bytes in size.
2e4b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2e4c0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d  alance_quick(Mem
2e4d0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d  Page *pParent, M
2e4e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
2e4f0 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74  8 *pSpace){.  Bt
2e500 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42  Shared *const pB
2e510 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20  t = pPage->pBt; 
2e520 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74     /* B-Tree Dat
2e530 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  abase */.  MemPa
2e540 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  ge *pNew;       
2e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e560 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
2e570 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ed page */.  int
2e580 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2e590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e5a0 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2e5b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e   */.  Pgno pgnoN
2e5c0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
2e5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2e5e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65  ge number of pNe
2e5f0 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  w */..  assert( 
2e600 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2e610 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2e620 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
2e630 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
2e640 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65  swriteable(pPare
2e650 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  nt->pDbPage) );.
2e660 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e670 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b  >nOverflow==1 );
2e680 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f  ..  /* This erro
2e690 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 6e  r condition is n
2e6a0 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
2e6b0 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
2e6c0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 69   function */.  i
2e6d0 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  f( pPage->nCell<
2e6e0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2e6f0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2e700 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
2e710 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69 73  a new page. This
2e720 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d   page will becom
2e730 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62 6c  e the right-sibl
2e740 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50 61  ing of .  ** pPa
2e750 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 72  ge. Make the par
2e760 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62 6c  ent page writabl
2e770 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  e, so that the n
2e780 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 0a  ew divider cell.
2e790 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73 65    ** may be inse
2e7a0 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74 68  rted. If both th
2e7b0 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ese operations a
2e7c0 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  re successful, p
2e7d0 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 72  roceed..  */.  r
2e7e0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2e7f0 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77  ePage(pBt, &pNew
2e800 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30  , &pgnoNew, 0, 0
2e810 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
2e820 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20 20  LITE_OK ){..    
2e830 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70 61  u8 *pOut = &pSpa
2e840 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a 70  ce[4];.    u8 *p
2e850 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f  Cell = pPage->aO
2e860 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
2e870 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63    u16 szCell = c
2e880 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2e890 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38  , pCell);.    u8
2e8a0 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73   *pStop;..    as
2e8b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2e8c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e  erIswriteable(pN
2e8d0 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ew->pDbPage) );.
2e8e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2e8f0 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54  e->aData[0]==(PT
2e900 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2e910 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 20  FDATA|PTF_LEAF) 
2e920 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
2e930 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59  pNew, PTF_INTKEY
2e940 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
2e950 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73 73  F_LEAF);.    ass
2e960 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20  emblePage(pNew, 
2e970 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65  1, &pCell, &szCe
2e980 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ll);..    /* If 
2e990 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2e9a0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2e9b0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
2e9c0 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77  ter map.    ** w
2e9d0 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ith entries for 
2e9e0 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e  the new page, an
2e9f0 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72  d any pointer fr
2ea00 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63  om the .    ** c
2ea10 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
2ea20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
2ea30 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f  age. If either o
2ea40 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f  f these.    ** o
2ea50 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c  perations fails,
2ea60 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   the return code
2ea70 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65   is set, but the
2ea80 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a   contents.    **
2ea90 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70   of the parent p
2eaa0 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61  age are still ma
2eab0 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68  nipulated by thh
2eac0 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20   code below..   
2ead0 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20   ** That is Ok, 
2eae0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  at this point th
2eaf0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
2eb00 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20   guaranteed to. 
2eb10 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
2eb20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e  as dirty. Return
2eb30 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
2eb40 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20  e will cause a. 
2eb50 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20     ** rollback, 
2eb60 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e  undoing any chan
2eb70 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20  ges made to the 
2eb80 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
2eb90 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2eba0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2ebb0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
2ebc0 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50   pgnoNew, PTRMAP
2ebd0 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d  _BTREE, pParent-
2ebe0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
2ebf0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e     if( szCell>pN
2ec00 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a  ew->minLocal ){.
2ec10 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75          ptrmapPu
2ec20 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70  tOvflPtr(pNew, p
2ec30 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20  Cell, &rc);.    
2ec40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
2ec50 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76   /* Create a div
2ec60 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73  ider cell to ins
2ec70 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ert into pParent
2ec80 2e 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65  . The divider ce
2ec90 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  ll.    ** consis
2eca0 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70  ts of a 4-byte p
2ecb0 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20  age number (the 
2ecc0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70  page number of p
2ecd0 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a  Page) and.    **
2ece0 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2ecf0 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68  th key value (wh
2ed00 69 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20  ich must be the 
2ed10 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68  same value as th
2ed20 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74  e.    ** largest
2ed30 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a   key on pPage)..
2ed40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f      **.    ** To
2ed50 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73   find the larges
2ed60 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70  t key value on p
2ed70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64  Page, first find
2ed80 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2ed90 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2eda0 70 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74  pPage. The first
2edb0 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74   two fields of t
2edc0 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65  his cell are the
2edd0 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d   .    ** record-
2ede0 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62  length (a variab
2edf0 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65  le length intege
2ee00 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74  r at most 32-bit
2ee10 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a  s in size).    *
2ee20 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61  * and the key va
2ee30 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20  lue (a variable 
2ee40 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20  length integer, 
2ee50 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c  may have any val
2ee60 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ue)..    ** The 
2ee70 66 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69  first of the whi
2ee80 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65  le(...) loops be
2ee90 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74  low skips over t
2eea0 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68  he record-length
2eeb0 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54  .    ** field. T
2eec0 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28  he second while(
2eed0 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73  ...) loop copies
2eee0 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66   the key value f
2eef0 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  rom the.    ** c
2ef00 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74  ell on pPage int
2ef10 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  o the pSpace buf
2ef20 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  fer..    */.    
2ef30 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2ef40 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
2ef50 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74  Cell-1);.    pSt
2ef60 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a  op = &pCell[9];.
2ef70 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43      while( (*(pC
2ef80 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20  ell++)&0x80) && 
2ef90 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20  pCell<pStop );. 
2efa0 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c     pStop = &pCel
2efb0 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  l[9];.    while(
2efc0 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a   ((*(pOut++) = *
2efd0 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29  (pCell++))&0x80)
2efe0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2eff0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72  );..    /* Inser
2f000 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65  t the new divide
2f010 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72  r cell into pPar
2f020 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65  ent. */.    inse
2f030 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
2f040 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20  pParent->nCell, 
2f050 70 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f  pSpace, (int)(pO
2f060 75 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20  ut-pSpace),.    
2f070 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50             0, pP
2f080 61 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  age->pgno, &rc);
2f090 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
2f0a0 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
2f0b0 6e 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20  nter of pParent 
2f0c0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2f0d0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
2f0e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
2f0f0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2f100 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
2f110 20 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20   pgnoNew);.  .  
2f120 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
2f130 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2f140 65 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20  e new page. */. 
2f150 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2f160 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  New);.  }..  ret
2f170 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
2f180 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2f190 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a  QUICKBALANCE */.
2f1a0 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69  .#if 0./*.** Thi
2f1b0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2f1c0 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61  not contribute a
2f1d0 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f  nything to the o
2f1e0 70 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69  peration of SQLi
2f1f0 74 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d  te..** it is som
2f200 65 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64  etimes activated
2f210 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69   temporarily whi
2f220 6c 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64  le debugging cod
2f230 65 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a  e responsible .*
2f240 2a 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f  * for setting po
2f250 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
2f260 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2f270 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65   ptrmapCheckPage
2f280 73 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61  s(MemPage **apPa
2f290 67 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  ge, int nPage){.
2f2a0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f    int i, j;.  fo
2f2b0 72 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20  r(i=0; i<nPage; 
2f2c0 69 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  i++){.    Pgno n
2f2d0 3b 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20  ;.    u8 e;.    
2f2e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2f2f0 20 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20   apPage[i];.    
2f300 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2f310 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20  pPage->pBt;.    
2f320 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2f330 73 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f  sInit );..    fo
2f340 72 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e  r(j=0; j<pPage->
2f350 6e 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nCell; j++){.   
2f360 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
2f370 3b 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20  ;.      u8 *z;. 
2f380 20 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66      .      z = f
2f390 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a  indCell(pPage, j
2f3a0 29 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61  );.      btreePa
2f3b0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2f3c0 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  , z, &info);.   
2f3d0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
2f3e0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
2f3f0 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
2f400 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f  4byte(&z[info.iO
2f410 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
2f420 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2f430 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b  , ovfl, &e, &n);
2f440 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f450 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2f460 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  && e==PTRMAP_OVE
2f470 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20  RFLOW1 );.      
2f480 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
2f490 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2f4a0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
2f4b0 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20   get4byte(z);.  
2f4c0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2f4d0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
2f4e0 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
2f4f0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2f500 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2f510 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
2f520 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2f530 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2f540 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
2f550 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2f560 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2f570 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2f580 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2f590 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
2f5a0 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &n);.      asser
2f5b0 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2f5c0 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
2f5d0 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  TREE );.    }.  
2f5e0 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2f5f0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2f600 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2f610 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
2f620 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2f630 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
2f640 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
2f650 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2f660 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
2f670 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
2f680 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
2f690 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2f6a0 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
2f6b0 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
2f6c0 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
2f6d0 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
2f6e0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
2f6f0 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
2f700 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
2f710 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
2f720 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
2f730 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
2f740 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
2f750 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
2f760 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
2f770 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
2f780 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
2f790 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
2f7a0 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
2f7b0 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
2f7c0 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
2f7d0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
2f7e0 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
2f7f0 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c  ** MemPage.aOvfl
2f800 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20  [] array), they 
2f810 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74  are not copied t
2f820 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65  o pTo. .**.** Be
2f830 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
2f840 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e  page pTo is rein
2f850 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20  itialized using 
2f860 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  btreeInitPage().
2f870 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f  .**.** The perfo
2f880 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66  rmance of this f
2f890 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  unction is not c
2f8a0 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f  ritical. It is o
2f8b0 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  nly used by .** 
2f8c0 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  the balance_shal
2f8d0 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61  lower() and bala
2f8e0 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f  nce_deeper() pro
2f8f0 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72  cedures, neither
2f900 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65   of.** which are
2f910 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e   called often un
2f920 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75  der normal circu
2f930 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61  mstances..*/.sta
2f940 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64  tic void copyNod
2f950 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65  eContent(MemPage
2f960 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65   *pFrom, MemPage
2f970 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29   *pTo, int *pRC)
2f980 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
2f990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f9a0 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73   BtShared * cons
2f9b0 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70  t pBt = pFrom->p
2f9c0 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  Bt;.    u8 * con
2f9d0 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  st aFrom = pFrom
2f9e0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20  ->aData;.    u8 
2f9f0 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54  * const aTo = pT
2fa00 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e  o->aData;.    in
2fa10 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72  t const iFromHdr
2fa20 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66   = pFrom->hdrOff
2fa30 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  set;.    int con
2fa40 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54  st iToHdr = ((pT
2fa50 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30  o->pgno==1) ? 10
2fa60 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  0 : 0);.    int 
2fa70 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74  rc;.    int iDat
2fa80 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73  a;.  .  .    ass
2fa90 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e  ert( pFrom->isIn
2faa0 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  it );.    assert
2fab0 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d  ( pFrom->nFree>=
2fac0 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73  iToHdr );.    as
2fad0 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
2fae0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
2faf0 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  ]) <= (int)pBt->
2fb00 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
2fb10 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
2fb20 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e   b-tree node con
2fb30 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70  tent from page p
2fb40 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2fb50 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d  . */.    iData =
2fb60 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
2fb70 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20  [iFromHdr+5]);. 
2fb80 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
2fb90 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44  Data], &aFrom[iD
2fba0 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ata], pBt->usabl
2fbb0 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20  eSize-iData);.  
2fbc0 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54    memcpy(&aTo[iT
2fbd0 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46  oHdr], &aFrom[iF
2fbe0 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e  romHdr], pFrom->
2fbf0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
2fc00 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  From->nCell);.  
2fc10 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  .    /* Reinitia
2fc20 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f  lize page pTo so
2fc30 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
2fc40 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ts of the MemPag
2fc50 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  e structure.    
2fc60 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
2fc70 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
2fc80 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
2fc90 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61   can actually fa
2fca0 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  il under.    ** 
2fcb0 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63  fairly obscure c
2fcc0 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76  ircumstances, ev
2fcd0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
2fce0 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  a copy of initia
2fcf0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61  lized .    ** pa
2fd00 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f  ge pFrom..    */
2fd10 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74  .    pTo->isInit
2fd20 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
2fd30 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f  treeInitPage(pTo
2fd40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2fd50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fd60 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
2fd70 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
2fd80 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
2fd90 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2fda0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2fdb0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2fdc0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r-map entries.  
2fdd0 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74    ** for any b-t
2fde0 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ree or overflow 
2fdf0 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e  pages that pTo n
2fe00 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
2fe10 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20  pointers to..   
2fe20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
2fe30 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2fe40 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c    *pRC = setChil
2fe50 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20  dPtrmaps(pTo);. 
2fe60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2fe70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2fe80 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c  edistributes cel
2fe90 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e  ls on the iParen
2fea0 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66  tIdx'th child of
2feb0 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72   pParent.** (her
2fec0 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65  eafter "the page
2fed0 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73  ") and up to 2 s
2fee0 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20  iblings so that 
2fef0 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
2ff00 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  bout the.** same
2ff10 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
2ff20 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61  space. Usually a
2ff30 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20   single sibling 
2ff40 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2ff50 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72  f the.** page ar
2ff60 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  e used in the ba
2ff70 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20  lancing, though 
2ff80 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69  both siblings mi
2ff90 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
2ffa0 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65  e.** side if the
2ffb0 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72   page is the fir
2ffc0 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  st or last child
2ffd0 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
2ffe0 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  If the page .** 
2fff0 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
30000 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74   siblings (somet
30010 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
30020 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
30030 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72  e page.** is a r
30040 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68  oot page or a ch
30050 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61  ild of a root pa
30060 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ge) then all ava
30070 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a  ilable siblings.
30080 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69  ** participate i
30090 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
300a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
300b0 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
300c0 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20   the page might 
300d0 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
300e0 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a  decreased by .**
300f0 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61   one or two in a
30100 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
30110 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
30120 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
30130 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  full. .**.** Not
30140 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
30150 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
30160 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
30170 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
30180 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
30190 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
301a0 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61  d in MemPage.aDa
301b0 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68  ta[]. This can h
301c0 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
301d0 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
301e0 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  . This routine e
301f0 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20  nsures that all 
30200 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a  cells allocated.
30210 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  ** to the page a
30220 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20  nd its siblings 
30230 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65  fit into MemPage
30240 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20  .aData[] before 
30250 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
30260 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
30270 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
30280 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
30290 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79  lings, cells may
302a0 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20   be.** inserted 
302b0 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  into or removed 
302c0 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
302d0 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20  page (pParent). 
302e0 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20  Doing so.** may 
302f0 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74  cause the parent
30300 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20   page to become 
30310 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
30320 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a  rfull. If this.*
30330 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  * happens, it is
30340 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
30350 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
30360 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  r to invoke the 
30370 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e  correct.** balan
30380 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20  cing routine to 
30390 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  fix this problem
303a0 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63   (see the balanc
303b0 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a  e() routine). .*
303c0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
303d0 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
303e0 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
303f0 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
30400 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
30410 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
30420 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
30430 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61  ne fails, the da
30440 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a  tabase should.**
30450 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
30460 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64  .**.** The third
30470 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
30480 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66  s function, aOvf
30490 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69  lSpace, is a poi
304a0 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66  nter to a.** buf
304b0 66 65 72 20 62 69 67 20 65 6e 6f 75 67 68 20 74  fer big enough t
304c0 6f 20 68 6f 6c 64 20 6f 6e 65 20 70 61 67 65 2e  o hold one page.
304d0 20 49 66 20 77 68 69 6c 65 20 69 6e 73 65 72 74   If while insert
304e0 69 6e 67 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  ing cells into t
304f0 68 65 20 70 61 72 65 6e 74 0a 2a 2a 20 70 61 67  he parent.** pag
30500 65 20 28 70 50 61 72 65 6e 74 29 20 74 68 65 20  e (pParent) the 
30510 70 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f  parent page beco
30520 6d 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68  mes overfull, th
30530 69 73 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20  is buffer is.** 
30540 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
30550 65 20 70 61 72 65 6e 74 27 73 20 6f 76 65 72 66  e parent's overf
30560 6c 6f 77 20 63 65 6c 6c 73 2e 20 42 65 63 61 75  low cells. Becau
30570 73 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  se this function
30580 20 69 6e 73 65 72 74 73 0a 2a 2a 20 61 20 6d 61   inserts.** a ma
30590 78 69 6d 75 6d 20 6f 66 20 66 6f 75 72 20 64 69  ximum of four di
305a0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
305b0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
305c0 2c 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  , and the maximu
305d0 6d 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 20 63  m.** size of a c
305e0 65 6c 6c 20 73 74 6f 72 65 64 20 77 69 74 68 69  ell stored withi
305f0 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  n an internal no
30600 64 65 20 69 73 20 61 6c 77 61 79 73 20 6c 65 73  de is always les
30610 73 20 74 68 61 6e 20 31 2f 34 0a 2a 2a 20 6f 66  s than 1/4.** of
30620 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 2c 20   the page-size, 
30630 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d  the aOvflSpace[]
30640 20 62 75 66 66 65 72 20 69 73 20 67 75 61 72 61   buffer is guara
30650 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 61 72 67  nteed to be larg
30660 65 0a 2a 2a 20 65 6e 6f 75 67 68 20 66 6f 72 20  e.** enough for 
30670 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  all overflow cel
30680 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 4f 76  ls..**.** If aOv
30690 66 6c 53 70 61 63 65 20 69 73 20 73 65 74 20 74  flSpace is set t
306a0 6f 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72  o a null pointer
306b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
306c0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
306d0 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a 2f 0a 73 74 61  TE_NOMEM..*/.sta
306e0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
306f0 6e 6f 6e 72 6f 6f 74 28 0a 20 20 4d 65 6d 50 61  nonroot(.  MemPa
30700 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
30710 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
30720 72 65 6e 74 20 70 61 67 65 20 6f 66 20 73 69 62  rent page of sib
30730 6c 69 6e 67 73 20 62 65 69 6e 67 20 62 61 6c 61  lings being bala
30740 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 50  nced */.  int iP
30750 61 72 65 6e 74 49 64 78 2c 20 20 20 20 20 20 20  arentIdx,       
30760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
30770 65 78 20 6f 66 20 22 74 68 65 20 70 61 67 65 22  ex of "the page"
30780 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
30790 20 75 38 20 2a 61 4f 76 66 6c 53 70 61 63 65 2c   u8 *aOvflSpace,
307a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307b0 20 2f 2a 20 70 61 67 65 2d 73 69 7a 65 20 62 79   /* page-size by
307c0 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
307d0 20 70 61 72 65 6e 74 20 6f 76 66 6c 20 2a 2f 0a   parent ovfl */.
307e0 20 20 69 6e 74 20 69 73 52 6f 6f 74 20 20 20 20    int isRoot    
307f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30800 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
30810 72 65 6e 74 20 69 73 20 61 20 72 6f 6f 74 2d 70  rent is a root-p
30820 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  age */.){.  BtSh
30830 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
30840 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30850 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a  whole database *
30860 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20  /.  int nCell = 
30870 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
30880 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
30890 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
308a0 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c  */.  int nMaxCel
308b0 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ls = 0;         
308c0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73    /* Allocated s
308d0 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73  ize of apCell, s
308e0 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f  zCell, aFrom. */
308f0 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b  .  int nNew = 0;
30900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30910 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
30920 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  es in apNew[] */
30930 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20  .  int nOld;    
30940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30950 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
30960 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f  es in apOld[] */
30970 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20  .  int i, j, k; 
30980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30990 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
309a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b   */.  int nxDiv;
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
309c0 20 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64     /* Next divid
309d0 65 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65  er slot in pPare
309e0 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  nt->aCell[] */. 
309f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30a00 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  _OK;          /*
30a10 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
30a20 20 2a 2f 0a 20 20 75 31 36 20 6c 65 61 66 43 6f   */.  u16 leafCo
30a30 72 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  rrection;       
30a40 20 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65     /* 4 if pPage
30a50 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
30a60 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  f not */.  int l
30a70 65 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20  eafData;        
30a80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
30a90 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
30aa0 61 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41  af of a LEAFDATA
30ab0 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75   tree */.  int u
30ac0 73 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20  sableSpace;     
30ad0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
30ae0 20 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64   in pPage beyond
30af0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
30b00 20 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20   int pageFlags; 
30b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30b20 20 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d   Value of pPage-
30b30 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69  >aData[0] */.  i
30b40 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20  nt subtotal;    
30b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
30b60 75 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73  ubtotal of bytes
30b70 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65   in cells on one
30b80 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
30b90 53 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20  Space1 = 0;     
30ba0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
30bb0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
30bc0 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69  aSpace1[] */.  i
30bd0 6e 74 20 69 4f 76 66 6c 53 70 61 63 65 20 3d 20  nt iOvflSpace = 
30be0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
30bf0 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
30c00 20 6f 66 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d   of aOvflSpace[]
30c10 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
30c20 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
30c30 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
30c40 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
30c50 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
30c60 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
30c70 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
30c80 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
30c90 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 4d 65  siblings */.  Me
30ca0 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42  mPage *apCopy[NB
30cb0 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72  ];         /* Pr
30cc0 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20  ivate copies of 
30cd0 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f  apOld[] pages */
30ce0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65  .  MemPage *apNe
30cf0 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
30d00 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
30d10 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61  to NB siblings a
30d20 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a  fter balancing *
30d30 2f 0a 20 20 75 38 20 2a 70 52 69 67 68 74 3b 20  /.  u8 *pRight; 
30d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d50 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 69 6e 20   /* Location in 
30d60 70 61 72 65 6e 74 20 6f 66 20 72 69 67 68 74 2d  parent of right-
30d70 73 69 62 6c 69 6e 67 20 70 6f 69 6e 74 65 72 20  sibling pointer 
30d80 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e  */.  u8 *apDiv[N
30d90 42 2d 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B-1];           
30da0 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c    /* Divider cel
30db0 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f  ls in pParent */
30dc0 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42  .  int cntNew[NB
30dd0 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  +2];            
30de0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c  /* Index in aCel
30df0 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65  l[] of cell afte
30e00 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  r i-th page */. 
30e10 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d   int szNew[NB+2]
30e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
30e30 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f   Combined size o
30e40 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e  f cells place on
30e50 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20   i-th page */.  
30e60 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b  u8 **apCell = 0;
30e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e80 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20  All cells begin 
30e90 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31  balanced */.  u1
30ea0 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20  6 *szCell;      
30eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
30ec0 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  cal size of all 
30ed0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
30ee0 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
30ef0 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  e1;             
30f00 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
30f10 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69 64   copies of divid
30f20 65 72 73 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 50  ers cells */.  P
30f30 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
30f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30f50 65 6d 70 20 76 61 72 20 74 6f 20 73 74 6f 72 65  emp var to store
30f60 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69   a page number i
30f70 6e 20 2a 2f 0a 0a 20 20 70 42 74 20 3d 20 70 50  n */..  pBt = pP
30f80 61 72 65 6e 74 2d 3e 70 42 74 3b 0a 20 20 61 73  arent->pBt;.  as
30f90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
30fa0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
30fb0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
30fc0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
30fd0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
30fe0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  t->pDbPage) );..
30ff0 23 69 66 20 30 0a 20 20 54 52 41 43 45 28 28 22  #if 0.  TRACE(("
31000 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70  BALANCE: begin p
31010 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20  age %d child of 
31020 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
31030 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  no, pParent->pgn
31040 6f 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  o));.#endif..  /
31050 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
31060 70 50 61 72 65 6e 74 20 6d 61 79 20 68 61 76 65  pParent may have
31070 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 6f 76 65   at most one ove
31080 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 41 6e 64 20  rflow cell. And 
31090 69 66 0a 20 20 2a 2a 20 74 68 69 73 20 6f 76 65  if.  ** this ove
310a0 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20 70 72  rflow cell is pr
310b0 65 73 65 6e 74 2c 20 69 74 20 6d 75 73 74 20 62  esent, it must b
310c0 65 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  e the cell with 
310d0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 50 61 72  .  ** index iPar
310e0 65 6e 74 49 64 78 2e 20 54 68 69 73 20 73 63 65  entIdx. This sce
310f0 6e 61 72 69 6f 20 63 6f 6d 65 73 20 61 62 6f 75  nario comes abou
31100 74 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  t when this func
31110 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 63 61 6c  tion.  ** is cal
31120 6c 65 64 20 28 69 6e 64 69 72 65 63 74 6c 79 29  led (indirectly)
31130 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
31140 65 65 44 65 6c 65 74 65 28 29 2e 0a 20 20 2a 2f  eeDelete()..  */
31150 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
31160 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  nt->nOverflow==0
31170 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76   || pParent->nOv
31180 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 61  erflow==1 );.  a
31190 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
311a0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
311b0 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
311c0 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e 74 49 64  ].idx==iParentId
311d0 78 20 29 3b 0a 0a 20 20 69 66 28 20 21 61 4f 76  x );..  if( !aOv
311e0 66 6c 53 70 61 63 65 20 29 7b 0a 20 20 20 20 72  flSpace ){.    r
311f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
31200 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  EM;.  }..  /* Fi
31210 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  nd the sibling p
31220 61 67 65 73 20 74 6f 20 62 61 6c 61 6e 63 65 2e  ages to balance.
31230 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20 74 68 65   Also locate the
31240 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
31250 74 20 0a 20 20 2a 2a 20 74 68 61 74 20 64 69 76  t .  ** that div
31260 69 64 65 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ide the siblings
31270 2e 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20  . An attempt is 
31280 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
31290 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a 20 20 2a  siblings on .  *
312a0 2a 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66  * either side of
312b0 20 70 50 61 67 65 2e 20 4d 6f 72 65 20 73 69 62   pPage. More sib
312c0 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
312d0 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
312e0 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a 20 69 66  owever, .  ** if
312f0 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
31300 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
31310 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
31320 69 64 65 2e 20 49 66 20 70 50 61 72 65 6e 74 0a  ide. If pParent.
31330 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66    ** has NB or f
31340 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68  ewer children th
31350 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  en all children 
31360 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20 74  of pParent are t
31370 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  aken.  .  **.  *
31380 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
31390 20 64 72 6f 70 73 20 74 68 65 20 64 69 76 69 64   drops the divid
313a0 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74 68  er cells from th
313b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 54  e parent page. T
313c0 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c 20 74 68  his.  ** way, th
313d0 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
313e0 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  he function does
313f0 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 64 65 61   not have to dea
31400 6c 20 77 69 74 68 20 61 6e 79 0a 20 20 2a 2a 20  l with any.  ** 
31410 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 69  overflow cells i
31420 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  n the parent pag
31430 65 2c 20 73 69 6e 63 65 20 69 66 20 61 6e 79 20  e, since if any 
31440 65 78 69 73 74 65 64 20 74 68 65 79 20 77 69 6c  existed they wil
31450 6c 0a 20 20 2a 2a 20 68 61 76 65 20 61 6c 72 65  l.  ** have alre
31460 61 64 79 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  ady been removed
31470 2e 0a 20 20 2a 2f 0a 20 20 69 20 3d 20 70 50 61  ..  */.  i = pPa
31480 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  rent->nOverflow 
31490 2b 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  + pParent->nCell
314a0 3b 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  ;.  if( i<2 ){. 
314b0 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
314c0 20 20 6e 4f 6c 64 20 3d 20 69 2b 31 3b 0a 20 20    nOld = i+1;.  
314d0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 6c 64 20  }else{.    nOld 
314e0 3d 20 33 3b 0a 20 20 20 20 69 66 28 20 69 50 61  = 3;.    if( iPa
314f0 72 65 6e 74 49 64 78 3d 3d 30 20 29 7b 20 20 20  rentIdx==0 ){   
31500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20                . 
31510 20 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a       nxDiv = 0;.
31520 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
31530 61 72 65 6e 74 49 64 78 3d 3d 69 20 29 7b 0a 20  arentIdx==i ){. 
31540 20 20 20 20 20 6e 78 44 69 76 20 3d 20 69 2d 32       nxDiv = i-2
31550 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31560 20 20 20 6e 78 44 69 76 20 3d 20 69 50 61 72 65     nxDiv = iPare
31570 6e 74 49 64 78 2d 31 3b 0a 20 20 20 20 7d 0a 20  ntIdx-1;.    }. 
31580 20 20 20 69 20 3d 20 32 3b 0a 20 20 7d 0a 20 20     i = 2;.  }.  
31590 69 66 28 20 28 69 2b 6e 78 44 69 76 2d 70 50 61  if( (i+nxDiv-pPa
315a0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29  rent->nOverflow)
315b0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
315c0 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 20 3d   ){.    pRight =
315d0 20 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61   &pParent->aData
315e0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
315f0 73 65 74 2b 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b  set+8];.  }else{
31600 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 66 69  .    pRight = fi
31610 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
31620 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
31630 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 7d  >nOverflow);.  }
31640 0a 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79  .  pgno = get4by
31650 74 65 28 70 52 69 67 68 74 29 3b 0a 20 20 77 68  te(pRight);.  wh
31660 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 72 63  ile( 1 ){.    rc
31670 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
31680 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 61 70  e(pBt, pgno, &ap
31690 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Old[i]);.    if(
316a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d   rc ){.      mem
316b0 73 65 74 28 61 70 4f 6c 64 2c 20 30 2c 20 28 69  set(apOld, 0, (i
316c0 2b 31 29 2a 73 69 7a 65 6f 66 28 4d 65 6d 50 61  +1)*sizeof(MemPa
316d0 67 65 2a 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  ge*));.      got
316e0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
316f0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61  p;.    }.    nMa
31700 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c  xCells += 1+apOl
31710 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c  d[i]->nCell+apOl
31720 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  d[i]->nOverflow;
31730 0a 20 20 20 20 69 66 28 20 28 69 2d 2d 29 3d 3d  .    if( (i--)==
31740 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  0 ) break;..    
31750 69 66 28 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61  if( i+nxDiv==pPa
31760 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  rent->aOvfl[0].i
31770 64 78 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e  dx && pParent->n
31780 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
31790 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 70 50 61    apDiv[i] = pPa
317a0 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  rent->aOvfl[0].p
317b0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70 67 6e 6f  Cell;.      pgno
317c0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
317d0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
317e0 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
317f0 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
31800 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 50  iv[i]);.      pP
31810 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
31820 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
31830 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
31840 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  = findCell(pPare
31850 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
31860 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3b  ent->nOverflow);
31870 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  .      pgno = ge
31880 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
31890 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d  ;.      szNew[i]
318a0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
318b0 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
318c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 72 6f  );..      /* Dro
318d0 70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  p the cell from 
318e0 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
318f0 20 61 70 44 69 76 5b 69 5d 20 73 74 69 6c 6c 20   apDiv[i] still 
31900 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20 20 20 20  points to.      
31910 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68  ** the cell with
31920 69 6e 20 74 68 65 20 70 61 72 65 6e 74 2c 20 65  in the parent, e
31930 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 68 61  ven though it ha
31940 73 20 62 65 65 6e 20 64 72 6f 70 70 65 64 2e 0a  s been dropped..
31950 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
31960 20 73 61 66 65 20 62 65 63 61 75 73 65 20 64 72   safe because dr
31970 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c 20 6f 6e  opping a cell on
31980 6c 79 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ly overwrites th
31990 65 20 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a  e first.      **
319a0 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69   four bytes of i
319b0 74 2c 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  t, and this func
319c0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 6e 65  tion does not ne
319d0 65 64 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  ed the first.   
319e0 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
319f0 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20   of the divider 
31a00 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20 70 6f 69  cell. So the poi
31a10 6e 74 65 72 20 69 73 20 73 61 66 65 20 74 6f 20  nter is safe to 
31a20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 6c 61 74  use.      ** lat
31a30 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20 20 20 2a  er on.  .      *
31a40 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e 6c 65 73  *.      ** Unles
31a50 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70  s SQLite is comp
31a60 69 6c 65 64 20 69 6e 20 73 65 63 75 72 65 2d 64  iled in secure-d
31a70 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 74  elete mode. In t
31a80 68 69 73 20 63 61 73 65 2c 0a 20 20 20 20 20 20  his case,.      
31a90 2a 2a 20 74 68 65 20 64 72 6f 70 43 65 6c 6c 28  ** the dropCell(
31aa0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  ) routine will o
31ab0 76 65 72 77 72 69 74 65 20 74 68 65 20 65 6e 74  verwrite the ent
31ac0 69 72 65 20 63 65 6c 6c 20 77 69 74 68 20 7a 65  ire cell with ze
31ad0 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  roes..      ** I
31ae0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 65 6d  n this case, tem
31af0 70 6f 72 61 72 69 6c 79 20 63 6f 70 79 20 74 68  porarily copy th
31b00 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  e cell into the 
31b10 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a 20 20 20  aOvflSpace[].   
31b20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 49 74     ** buffer. It
31b30 20 77 69 6c 6c 20 62 65 20 63 6f 70 69 65 64 20   will be copied 
31b40 6f 75 74 20 61 67 61 69 6e 20 61 73 20 73 6f 6f  out again as soo
31b50 6e 20 61 73 20 74 68 65 20 61 53 70 61 63 65 5b  n as the aSpace[
31b60 5d 20 62 75 66 66 65 72 0a 20 20 20 20 20 20 2a  ] buffer.      *
31b70 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e 20  * is allocated. 
31b80 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
31b90 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 20  t->secureDelete 
31ba0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
31bb0 4f 66 66 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  Off = SQLITE_PTR
31bc0 5f 54 4f 5f 49 4e 54 28 61 70 44 69 76 5b 69 5d  _TO_INT(apDiv[i]
31bd0 29 20 2d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  ) - SQLITE_PTR_T
31be0 4f 5f 49 4e 54 28 70 50 61 72 65 6e 74 2d 3e 61  O_INT(pParent->a
31bf0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 69  Data);.        i
31c00 66 28 20 28 69 4f 66 66 2b 73 7a 4e 65 77 5b 69  f( (iOff+szNew[i
31c10 5d 29 3e 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  ])>(int)pBt->usa
31c20 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
31c30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
31c40 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31c50 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
31c60 61 70 4f 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a  apOld, 0, (i+1)*
31c70 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29  sizeof(MemPage*)
31c80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
31c90 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
31ca0 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
31cb0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
31cc0 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 69  py(&aOvflSpace[i
31cd0 4f 66 66 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  Off], apDiv[i], 
31ce0 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
31cf0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
31d00 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
31d10 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
31d20 61 74 61 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ata];.        }.
31d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 72        }.      dr
31d40 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
31d50 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d  i+nxDiv-pParent-
31d60 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e 65  >nOverflow, szNe
31d70 77 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20  w[i], &rc);.    
31d80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
31d90 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
31da0 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72  tiple of 4 in or
31db0 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
31dc0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
31dd0 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
31de0 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
31df0 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a  s + 3)&~3;..  /*
31e00 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
31e10 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
31e20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
31e30 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53    k = pBt->pageS
31e40 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a  ize + ROUND8(siz
31e50 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20  eof(MemPage));. 
31e60 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20   szScratch =.   
31e70 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69      nMaxCells*si
31e80 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20  zeof(u8*)       
31e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ea0 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* apCell */.   
31eb0 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69    + nMaxCells*si
31ec0 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20  zeof(u16)       
31ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ee0 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20  /* szCell */.   
31ef0 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
31f00 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
31f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20  /* aSpace1 */.  
31f30 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20     + k*nOld;    
31f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f60 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20   /* Page copies 
31f70 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70  (apCopy) */.  ap
31f80 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63  Cell = sqlite3Sc
31f90 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53  ratchMalloc( szS
31fa0 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28  cratch ); .  if(
31fb0 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20   apCell==0 ){.  
31fc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
31fd0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61  MEM;.    goto ba
31fe0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
31ff0 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75   }.  szCell = (u
32000 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78  16*)&apCell[nMax
32010 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65  Cells];.  aSpace
32020 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c  1 = (u8*)&szCell
32030 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
32040 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
32050 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61  E_ALIGNMENT(aSpa
32060 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20  ce1) );..  /*.  
32070 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73  ** Load pointers
32080 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   to all cells on
32090 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
320a0 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63  nd the divider c
320b0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  ells.  ** into t
320c0 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b  he local apCell[
320d0 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63  ] array.  Make c
320e0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76  opies of the div
320f0 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
32100 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
32110 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31  ned from aSpace1
32120 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68  [] and remove th
32130 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65  e the divider Ce
32140 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
32150 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
32160 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
32170 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
32180 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
32190 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
321a0 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
321b0 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
321c0 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
321d0 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
321e0 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
321f0 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
32200 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
32210 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
32220 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
32230 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
32240 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
32250 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
32260 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
32270 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
32280 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
32290 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
322a0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
322b0 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
322c0 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
322d0 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
322e0 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
322f0 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
32300 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
32310 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
32320 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
32330 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
32340 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
32350 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
32360 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f  s..  */.  leafCo
32370 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64  rrection = apOld
32380 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c  [0]->leaf*4;.  l
32390 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b  eafData = apOld[
323a0 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66  0]->hasData;.  f
323b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
323c0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69  i++){.    int li
323d0 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a  mit;.    .    /*
323e0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
323f0 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b  ything else, tak
32400 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
32410 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69  i'th original si
32420 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65  bling.    ** The
32430 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
32440 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
32450 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
32460 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20  pies rather.    
32470 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ** that the orig
32480 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65  inal pages since
32490 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
324a0 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74  ges will be in t
324b0 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
324c0 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
324d0 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20  ritten.  */.    
324e0 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
324f0 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d  apCopy[i] = (Mem
32500 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70  Page*)&aSpace1[p
32510 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b  Bt->pageSize + k
32520 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  *i];.    memcpy(
32530 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20  pOld, apOld[i], 
32540 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29  sizeof(MemPage))
32550 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74  ;.    pOld->aDat
32560 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64  a = (void*)&pOld
32570 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [1];.    memcpy(
32580 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f  pOld->aData, apO
32590 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42  ld[i]->aData, pB
325a0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  t->pageSize);.. 
325b0 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d     limit = pOld-
325c0 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
325d0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
325e0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  pOld->nOverflow>
325f0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
32600 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
32610 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
32620 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
32630 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70  ls );.        ap
32640 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
32650 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
32660 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  Old, j);.       
32670 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
32680 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
32690 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
326a0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
326b0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
326c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 38 20  }else{.      u8 
326d0 2a 61 44 61 74 61 20 3d 20 70 4f 6c 64 2d 3e 61  *aData = pOld->a
326e0 44 61 74 61 3b 0a 20 20 20 20 20 20 75 31 36 20  Data;.      u16 
326f0 6d 61 73 6b 50 61 67 65 20 3d 20 70 4f 6c 64 2d  maskPage = pOld-
32700 3e 6d 61 73 6b 50 61 67 65 3b 0a 20 20 20 20 20  >maskPage;.     
32710 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 20   u16 cellOffset 
32720 3d 20 70 4f 6c 64 2d 3e 63 65 6c 6c 4f 66 66 73  = pOld->cellOffs
32730 65 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  et;.      for(j=
32740 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
32750 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
32760 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
32770 73 20 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43  s );.        apC
32780 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e  ell[nCell] = fin
32790 64 43 65 6c 6c 76 32 28 61 44 61 74 61 2c 20 6d  dCellv2(aData, m
327a0 61 73 6b 50 61 67 65 2c 20 63 65 6c 6c 4f 66 66  askPage, cellOff
327b0 73 65 74 2c 20 6a 29 3b 0a 20 20 20 20 20 20 20  set, j);.       
327c0 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
327d0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c   cellSizePtr(pOl
327e0 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d  d, apCell[nCell]
327f0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
32800 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
32810 7d 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 28  }       .    if(
32820 20 69 3c 6e 4f 6c 64 2d 31 20 26 26 20 21 6c 65   i<nOld-1 && !le
32830 61 66 44 61 74 61 29 7b 0a 20 20 20 20 20 20 75  afData){.      u
32840 31 36 20 73 7a 20 3d 20 28 75 31 36 29 73 7a 4e  16 sz = (u16)szN
32850 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 75 38 20  ew[i];.      u8 
32860 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 61 73  *pTemp;.      as
32870 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78  sert( nCell<nMax
32880 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 73  Cells );.      s
32890 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73  zCell[nCell] = s
328a0 7a 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d  z;.      pTemp =
328b0 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
328c0 31 5d 3b 0a 20 20 20 20 20 20 69 53 70 61 63 65  1];.      iSpace
328d0 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  1 += sz;.      a
328e0 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
328f0 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b 0a 20  maxLocal+23 );. 
32900 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70       assert( iSp
32910 61 63 65 31 20 3c 3d 20 28 69 6e 74 29 70 42 74  ace1 <= (int)pBt
32920 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
32930 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
32940 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
32950 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
32960 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
32970 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
32980 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
32990 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
329a0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
329b0 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
329c0 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
329d0 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
329e0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
329f0 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
32a00 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
32a10 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
32a20 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
32a30 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
32a40 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
32a50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
32a60 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
32a70 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
32a80 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
32a90 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
32aa0 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
32ab0 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
32ac0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
32ad0 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
32ae0 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
32af0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
32b00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
32b10 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
32b20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
32b30 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
32b40 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
32b50 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
32b60 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
32b70 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
32b80 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
32b90 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
32ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
32bb0 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
32bc0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
32bd0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
32be0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
32bf0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
32c00 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
32c10 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
32c20 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
32c30 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
32c40 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
32c50 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
32c60 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
32c70 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
32c80 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
32c90 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
32ca0 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
32cb0 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
32cc0 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
32cd0 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
32ce0 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
32cf0 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
32d00 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
32d10 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
32d20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
32d30 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
32d40 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
32d50 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
32d60 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
32d70 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
32d80 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
32d90 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
32da0 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
32db0 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
32dc0 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
32dd0 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
32de0 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
32df0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
32e00 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
32e10 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
32e20 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
32e30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
32e40 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
32e50 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
32e60 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
32e70 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
32e80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
32e90 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
32ea0 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
32eb0 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
32ec0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
32ed0 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
32ee0 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
32ef0 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
32f00 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
32f10 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
32f20 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
32f30 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
32f40 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
32f50 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
32f60 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
32f70 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
32f80 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
32f90 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
32fa0 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
32fb0 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
32fc0 52 52 55 50 54 5f 42 4b 50 54 3b 20 67 6f 74 6f  RRUPT_BKPT; goto
32fd0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
32fe0 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ; }.    }.  }.  
32ff0 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f  szNew[k] = subto
33000 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d  tal;.  cntNew[k]
33010 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b   = nCell;.  k++;
33020 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  /*.  ** The 
33030 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64  packing computed
33040 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
33050 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64   block is biased
33060 20 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c   toward the sibl
33070 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  ings.  ** on the
33080 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65   left side.  The
33090 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61   left siblings a
330a0 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79  re always nearly
330b0 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65   full, while the
330c0 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  .  ** right-most
330d0 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62   sibling might b
330e0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20  e nearly empty. 
330f0 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63   This block of c
33100 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a  ode attempts.  *
33110 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  * to adjust the 
33120 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69  packing of sibli
33130 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74  ngs to get a bet
33140 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a  ter balance..  *
33150 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75  *.  ** This adju
33160 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74  stment is more t
33170 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74  han an optimizat
33180 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e  ion.  The packin
33190 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20  g above might.  
331a0 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20  ** be so out of 
331b0 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65  balance as to be
331c0 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65   illegal.  For e
331d0 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68  xample, the righ
331e0 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c  t-most.  ** sibl
331f0 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d  ing might be com
33200 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20  pletely empty.  
33210 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
33220 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e  is not optional.
33230 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d  .  */.  for(i=k-
33240 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20  1; i>0; i--){.  
33250 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20    int szRight = 
33260 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69  szNew[i];  /* Si
33270 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
33280 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20   the right */.  
33290 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73    int szLeft = s
332a0 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69  zNew[i-1]; /* Si
332b0 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e  ze of sibling on
332c0 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20   the left */.   
332d0 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20   int r;         
332e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
332f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c   right-most cell
33300 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67   in left sibling
33310 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20   */.    int d;  
33320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
33330 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
33340 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ll to the left o
33350 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20  f right sibling 
33360 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e  */..    r = cntN
33370 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
33380 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
33390 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  fData;.    asser
333a0 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( d<nMaxCells )
333b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c  ;.    assert( r<
333c0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
333d0 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d   while( szRight=
333e0 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a  =0 || szRight+sz
333f0 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66  Cell[d]+2<=szLef
33400 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20  t-(szCell[r]+2) 
33410 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74  ){.      szRight
33420 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20   += szCell[d] + 
33430 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20  2;.      szLeft 
33440 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32  -= szCell[r] + 2
33450 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69  ;.      cntNew[i
33460 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d  -1]--;.      r =
33470 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31   cntNew[i-1] - 1
33480 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20  ;.      d = r + 
33490 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20  1 - leafData;.  
334a0 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    }.    szNew[i]
334b0 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20   = szRight;.    
334c0 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c  szNew[i-1] = szL
334d0 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  eft;.  }..  /* E
334e0 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f  ither we found o
334f0 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73  ne or more cells
33500 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20   (cntnew[0])>0) 
33510 6f 72 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a  or pPage is.  **
33520 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
33530 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c  page.  A virtual
33540 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68   root page is wh
33550 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74  en the real root
33560 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61  .  ** page is pa
33570 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20  ge 1 and we are 
33580 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f  the only child o
33590 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a  f that page..  *
335a0 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e  /.  assert( cntN
335b0 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72  ew[0]>0 || (pPar
335c0 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20  ent->pgno==1 && 
335d0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
335e0 30 29 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28  0) );..  TRACE((
335f0 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25  "BALANCE: old: %
33600 64 20 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20  d %d %d  ",.    
33610 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20  apOld[0]->pgno, 
33620 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61  .    nOld>=2 ? a
33630 70 4f 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[1]->pgno : 
33640 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f  0,.    nOld>=3 ?
33650 20 61 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20   apOld[2]->pgno 
33660 3a 20 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a  : 0.  ));..  /*.
33670 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
33680 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
33690 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
336a0 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
336b0 0a 20 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d  .  if( apOld[0]-
336c0 3e 70 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20  >pgno<=1 ){.    
336d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
336e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
336f0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
33700 75 70 3b 0a 20 20 7d 0a 20 20 70 61 67 65 46 6c  up;.  }.  pageFl
33710 61 67 73 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ags = apOld[0]->
33720 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28  aData[0];.  for(
33730 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
33740 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
33750 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c  w;.    if( i<nOl
33760 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20  d ){.      pNew 
33770 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f  = apNew[i] = apO
33780 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
33790 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
337a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
337b0 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
337c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
337d0 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
337e0 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
337f0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
33800 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
33810 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
33820 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
33830 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
33840 65 77 2c 20 26 70 67 6e 6f 2c 20 70 67 6e 6f 2c  ew, &pgno, pgno,
33850 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
33860 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
33870 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
33880 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b  apNew[i] = pNew;
33890 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 0a  .      nNew++;..
338a0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
338b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
338c0 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
338d0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
338e0 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f        if( ISAUTO
338f0 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
33900 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
33910 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52   pNew->pgno, PTR
33920 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65  MAP_BTREE, pPare
33930 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  nt->pgno, &rc);.
33940 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33960 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
33970 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
33980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
33990 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
339a0 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61 67 65  ree any old page
339b0 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f 74 20  s that were not 
339c0 72 65 75 73 65 64 20 61 73 20 6e 65 77 20 70 61  reused as new pa
339d0 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ges..  */.  whil
339e0 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  e( i<nOld ){.   
339f0 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
33a00 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66  i], &rc);.    if
33a10 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
33a20 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
33a30 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
33a40 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c  ld[i]);.    apOl
33a50 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b  d[i] = 0;.    i+
33a60 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  +;.  }..  /*.  *
33a70 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20 70 61  * Put the new pa
33a80 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
33a90 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20 68 65   order.  This he
33aa0 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70  lps to.  ** keep
33ab0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
33ac0 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64  disk file in ord
33ad0 65 72 20 73 6f 20 74 68 61 74 20 61 20 73 63 61  er so that a sca
33ae0 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61  n.  ** of the ta
33af0 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61 72 20  ble is a linear 
33b00 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 68 65  scan through the
33b10 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a   file.  That.  *
33b20 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70 73 20  * in turn helps 
33b30 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
33b40 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65 72 20  stem to deliver 
33b50 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  pages.  ** from 
33b60 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20 72 61  the disk more ra
33b70 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pidly..  **.  **
33b80 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72   An O(n^2) inser
33b90 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69  tion sort algori
33ba0 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62 75 74  thm is used, but
33bb0 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73   since.  ** n is
33bc0 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
33bd0 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e   NB (a small con
33be0 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73 68 6f  stant), that sho
33bf0 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  uld.  ** not be 
33c00 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a  a problem..  **.
33c10 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c    ** When NB==3,
33c20 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69   this one optimi
33c30 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65  zation makes the
33c40 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 61   database.  ** a
33c50 62 6f 75 74 20 32 35 25 20 66 61 73 74 65 72 20  bout 25% faster 
33c60 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65 72 74  for large insert
33c70 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74 69 6f  ions and deletio
33c80 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ns..  */.  for(i
33c90 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b  =0; i<k-1; i++){
33ca0 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20  .    int minV = 
33cb0 61 70 4e 65 77 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[i]->pgno;.
33cc0 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69      int minI = i
33cd0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b  ;.    for(j=i+1;
33ce0 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<k; j++){.    
33cf0 20 20 69 66 28 20 61 70 4e 65 77 5b 6a 5d 2d 3e    if( apNew[j]->
33d00 70 67 6e 6f 3c 28 75 6e 73 69 67 6e 65 64 29 6d  pgno<(unsigned)m
33d10 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  inV ){.        m
33d20 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  inI = j;.       
33d30 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 6a 5d   minV = apNew[j]
33d40 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  ->pgno;.      }.
33d50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69      }.    if( mi
33d60 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 4d 65  nI>i ){.      Me
33d70 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20  mPage *pT;.     
33d80 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
33d90 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
33da0 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
33db0 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
33dc0 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
33dd0 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25    TRACE(("new: %
33de0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
33df0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
33e00 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b  )\n",.    apNew[
33e10 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b  0]->pgno, szNew[
33e20 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
33e30 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f  ? apNew[1]->pgno
33e40 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
33e50 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
33e60 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65    nNew>=3 ? apNe
33e70 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[2]->pgno : 0, 
33e80 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
33e90 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
33ea0 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e  >=4 ? apNew[3]->
33eb0 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
33ec0 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
33ed0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
33ee0 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a  apNew[4]->pgno :
33ef0 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
33f00 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
33f10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
33f20 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
33f30 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
33f40 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  e) );.  put4byte
33f50 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e  (pRight, apNew[n
33f60 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a  New-1]->pgno);..
33f70 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
33f80 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
33f90 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
33fa0 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
33fb0 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
33fc0 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
33fd0 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
33fe0 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
33ff0 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
34000 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
34010 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
34020 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
34030 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
34040 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
34050 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
34060 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
34070 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  s );.    zeroPag
34080 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
34090 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  s);.    assemble
340a0 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
340b0 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
340c0 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
340d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
340e0 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
340f0 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
34100 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
34110 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
34120 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
34130 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
34140 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
34150 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
34160 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
34170 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
34180 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
34190 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
341a0 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
341b0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
341c0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
341d0 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a  t( i<nNew-1 || j
341e0 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ==nCell );.    i
341f0 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  f( j<nCell ){.  
34200 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
34210 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
34220 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
34230 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
34240 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
34250 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
34260 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
34270 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
34280 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
34290 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c    pTemp = &aOvfl
342a0 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65  Space[iOvflSpace
342b0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
342c0 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
342d0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
342e0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
342f0 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 4);.      }el
34300 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
34310 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
34320 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
34330 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
34340 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
34350 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
34360 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
34370 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
34380 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
34390 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
343a0 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
343b0 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
343c0 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
343d0 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
343e0 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
343f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
34400 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
34410 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
34420 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
34430 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
34440 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
34450 3b 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 50  ;.        btreeP
34460 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
34470 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
34480 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
34490 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
344a0 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70 75 74      sz = 4 + put
344b0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
344c0 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20  , info.nKey);.  
344d0 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
344e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
344f0 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
34500 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
34510 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
34520 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
34530 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
34540 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
34550 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
34560 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
34570 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
34580 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
34590 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
345a0 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
345b0 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
345c0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
345d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
345e0 65 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e btreeParseCell
345f0 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20 69  Ptr(), 4 bytes i
34600 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  s the minimum si
34610 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a  ze of.        **
34620 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20   any cell). But 
34630 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
34640 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72 72  to pass the corr
34650 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20  ect size to .   
34660 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65       ** insertCe
34670 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65  ll(), so reparse
34680 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20   the cell now.. 
34690 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
346a0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
346b0 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61  his can never ha
346c0 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74  ppen in an SQLit
346d0 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20  e data file, as 
346e0 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  all.        ** c
346f0 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73  ells are at leas
34700 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e  t 4 bytes. It on
34710 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d  ly happens in b-
34720 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20 20  trees used.     
34730 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74     ** to evaluat
34740 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  e "IN (SELECT ..
34750 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20  .)" and similar 
34760 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20  clauses..       
34770 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
34780 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a  szCell[j]==4 ){.
34790 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
347a0 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d  (leafCorrection=
347b0 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  =4);.          s
347c0 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  z = cellSizePtr(
347d0 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b  pParent, pCell);
347e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
347f0 20 7d 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70   }.      iOvflSp
34800 61 63 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ace += sz;.     
34810 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
34820 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 32 33 20 29 3b  ->maxLocal+23 );
34830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
34840 4f 76 66 6c 53 70 61 63 65 20 3c 3d 20 28 69 6e  OvflSpace <= (in
34850 74 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  t)pBt->pageSize 
34860 29 3b 0a 20 20 20 20 20 20 69 6e 73 65 72 74 43  );.      insertC
34870 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
34880 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70  iv, pCell, sz, p
34890 54 65 6d 70 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Temp, pNew->pgno
348a0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
348b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
348c0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
348d0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 73  leanup;.      as
348e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
348f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
34900 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
34910 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  );..      j++;. 
34920 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20       nxDiv++;.  
34930 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
34940 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20  ( j==nCell );.  
34950 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29  assert( nOld>0 )
34960 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
34970 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67  >0 );.  if( (pag
34980 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41  eFlags & PTF_LEA
34990 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20  F)==0 ){.    u8 
349a0 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70  *zChild = &apCop
349b0 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61  y[nOld-1]->aData
349c0 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [8];.    memcpy(
349d0 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e  &apNew[nNew-1]->
349e0 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64  aData[8], zChild
349f0 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 4);.  }..  if(
34a00 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72 65   isRoot && pPare
34a10 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20  nt->nCell==0 && 
34a20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
34a30 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46  et<=apNew[0]->nF
34a40 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ree ){.    /* Th
34a50 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
34a60 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63 6f  he b-tree now co
34a70 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e  ntains no cells.
34a80 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69 6e   The only siblin
34a90 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73  g.    ** page is
34aa0 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
34ab0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e 20   of the parent. 
34ac0 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
34ad0 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
34ae0 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f 20  child page into 
34af0 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63 72  the parent, decr
34b00 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72 61  easing the overa
34b10 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68 65  ll height of the
34b20 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 73  .    ** b-tree s
34b30 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65 2e  tructure by one.
34b40 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69 62   This is describ
34b50 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61 6e  ed as the "balan
34b60 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20 20  ce-shallower".  
34b70 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69 74    ** sub-algorit
34b80 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75 6d  hm in some docum
34b90 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  entation..    **
34ba0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20  .    ** If this 
34bb0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
34bc0 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  m database, the 
34bd0 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64 65  call to copyNode
34be0 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20 2a  Content() .    *
34bf0 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e 74  * sets all point
34c00 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63  er-map entries c
34c10 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
34c20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 70  database image p
34c30 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f 72  ages .    ** for
34c40 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e 74   which the point
34c50 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69 74  er is stored wit
34c60 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hin the content 
34c70 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20 20  being copied..  
34c80 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
34c90 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62 65  second assert be
34ca0 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68 61  low verifies tha
34cb0 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  t the child page
34cc0 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65 64   is defragmented
34cd0 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73 74  .    ** (it must
34ce0 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20 6a   be, as it was j
34cf0 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74 65  ust reconstructe
34d00 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c 65  d using assemble
34d10 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20 20  Page()). This.  
34d20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61 6e    ** is importan
34d30 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74 20  t if the parent 
34d40 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20  page happens to 
34d50 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  be page 1 of the
34d60 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
34d70 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20   image.  */.    
34d80 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31 20  assert( nNew==1 
34d90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  );.    assert( a
34da0 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 3d  pNew[0]->nFree =
34db0 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74 32  = .        (get2
34dc0 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d 3e  byte(&apNew[0]->
34dd0 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77 5b  aData[5])-apNew[
34de0 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d 61  0]->cellOffset-a
34df0 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a 32  pNew[0]->nCell*2
34e00 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6f  ) .    );.    co
34e10 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 61 70  pyNodeContent(ap
34e20 4e 65 77 5b 30 5d 2c 20 70 50 61 72 65 6e 74 2c  New[0], pParent,
34e30 20 26 72 63 29 3b 0a 20 20 20 20 66 72 65 65 50   &rc);.    freeP
34e40 61 67 65 28 61 70 4e 65 77 5b 30 5d 2c 20 26 72  age(apNew[0], &r
34e50 63 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  c);.  }else if( 
34e60 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
34e70 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70      /* Fix the p
34e80 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
34e90 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63  es for all the c
34ea0 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73  ells that were s
34eb0 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a  hifted around. .
34ec0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65      ** There are
34ed0 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65   several differe
34ee0 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e  nt types of poin
34ef0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
34f00 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20  that need to.   
34f10 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
34f20 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  h by this routin
34f30 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65  e. Some of these
34f40 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61   have been set a
34f50 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20  lready, but.    
34f60 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74  ** many have not
34f70 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
34f80 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20  is a summary:.  
34f90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29    **.    **   1)
34fa0 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73   The entries ass
34fb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77  ociated with new
34fc0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
34fd0 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20  hat were not.   
34fe0 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67   **      sibling
34ff0 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  s when this func
35000 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e  tion was called.
35010 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65   These have alre
35020 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ady.    **      
35030 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e  been set. We don
35040 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79  't need to worry
35050 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69   about old sibli
35060 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20  ngs that were.  
35070 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20    **      moved 
35080 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
35090 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28   - the freePage(
350a0 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e  ) code has taken
350b0 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20   care.    **    
350c0 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20    of those..    
350d0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54  **.    **   2) T
350e0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
350f0 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
35100 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
35110 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a   overflow.    **
35120 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e        page in an
35130 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  y overflow chain
35140 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69  s used by new di
35150 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65  vider cells. The
35160 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  se .    **      
35170 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64  have also alread
35180 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72  y been taken car
35190 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65  e of by the inse
351a0 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20  rtCell() code.. 
351b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33     **.    **   3
351c0 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  ) If the sibling
351d0 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c   pages are not l
351e0 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20  eaves, then the 
351f0 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20  child pages of. 
35200 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73     **      cells
35210 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73   stored on the s
35220 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79  ibling pages may
35230 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
35240 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ted..    **.    
35250 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73  **   4) If the s
35260 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
35270 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e   not internal in
35280 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e  tkey nodes, then
35290 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20   any.    **     
352a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
352b0 75 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65  used by these ce
352c0 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20  lls may need to 
352d0 62 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a  be updated.    *
352e0 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c  *      (internal
352f0 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65   intkey nodes ne
35300 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  ver contain poin
35310 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77  ters to overflow
35320 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a   pages)..    **.
35330 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74      **   5) If t
35340 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  he sibling pages
35350 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
35360 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65   then the pointe
35370 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20  r-map.    **    
35380 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68    entries for th
35390 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61  e right-child pa
353a0 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c  ges of each sibl
353b0 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ing may need.   
353c0 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75   **      to be u
353d0 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  pdated..    **. 
353e0 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e     ** Cases 1 an
353f0 64 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69  d 2 are dealt wi
35400 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65  th above by othe
35410 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74  r code. The next
35420 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65  .    ** block de
35430 61 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33  als with cases 3
35440 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f   and 4 and the o
35450 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63  ne after that, c
35460 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20  ase 5. Since.   
35470 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f   ** setting a po
35480 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
35490 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20  is a relatively 
354a0 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74  expensive operat
354b0 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a  ion, this.    **
354c0 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20   code only sets 
354d0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
354e0 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72  ies for child or
354f0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
35500 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a  that have.    **
35510 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20   actually moved 
35520 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20  between pages.  
35530 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
35540 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b  pNew = apNew[0];
35550 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
35560 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a  ld = apCopy[0];.
35570 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f      int nOverflo
35580 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  w = pOld->nOverf
35590 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65  low;.    int iNe
355a0 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43  xtOld = pOld->nC
355b0 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b  ell + nOverflow;
355c0 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c  .    int iOverfl
355d0 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20  ow = (nOverflow 
355e0 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d  ? pOld->aOvfl[0]
355f0 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20  .idx : -1);.    
35600 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  j = 0;          
35610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35620 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f     /* Current 'o
35630 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ld' sibling page
35640 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20   */.    k = 0;  
35650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
35670 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c  rrent 'new' sibl
35680 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
35690 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
356a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
356b0 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b  t isDivider = 0;
356c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d  .      while( i=
356d0 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20  =iNextOld ){.   
356e0 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
356f0 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
35700 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
35710 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
35720 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  n old.        **
35730 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e   sibling page j.
35740 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
35750 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
35760 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
35770 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
35780 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
35790 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65  was a divider ce
357a0 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ll. */.        p
357b0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a  Old = apCopy[++j
357c0 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ];.        iNext
357d0 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  Old = i + !leafD
357e0 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c  ata + pOld->nCel
357f0 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  l + pOld->nOverf
35800 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  low;.        if(
35810 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
35820 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
35830 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
35840 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
35850 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d       iOverflow =
35860 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
35870 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
35880 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  idx;.        }. 
35890 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
358a0 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a   = !leafData;  .
358b0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
358c0 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e  ssert(nOverflow>
358d0 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69  0 || iOverflow<i
358e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
358f0 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20  (nOverflow<2 || 
35900 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
35910 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  dx==pOld->aOvfl[
35920 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20  1].idx-1);.     
35930 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
35940 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76  w<3 || pOld->aOv
35950 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d  fl[1].idx==pOld-
35960 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29  >aOvfl[2].idx-1)
35970 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
35980 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
35990 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
359a0 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  1;.        if( (
359b0 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29  --nOverflow)>0 )
359c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  {.          iOve
359d0 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20  rflow++;.       
359e0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
359f0 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b    if( i==cntNew[
35a00 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  k] ){.        /*
35a10 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
35a20 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
35a30 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
35a40 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20  st cell on new. 
35a50 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
35a60 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65  g page k. If the
35a70 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
35a80 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
35a90 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
35aa0 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
35ab0 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69  n cell i is a di
35ac0 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a  vider cell.  */.
35ad0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61          pNew = a
35ae0 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20  pNew[++k];.     
35af0 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61     if( !leafData
35b00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35b10 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
35b20 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20  t( j<nOld );.   
35b30 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65     assert( k<nNe
35b40 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  w );..      /* I
35b50 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f  f the cell was o
35b60 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65  riginally divide
35b70 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e  r cell (and is n
35b80 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20  ot now) or.     
35b90 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   ** an overflow 
35ba0 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20  cell, or if the 
35bb0 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64  cell was located
35bc0 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
35bd0 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a  sibling.      **
35be0 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65   page before the
35bf0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e   balancing, then
35c00 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
35c10 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
35c20 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ted.      ** wit
35c30 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f  h any child or o
35c40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65  verflow pages ne
35c50 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ed to be updated
35c60 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  .  */.      if( 
35c70 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c  isDivider || pOl
35c80 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70  d->pgno!=pNew->p
35c90 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69  gno ){.        i
35ca0 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69  f( !leafCorrecti
35cb0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
35cc0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
35cd0 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b 69  et4byte(apCell[i
35ce0 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  ]), PTRMAP_BTREE
35cf0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72  , pNew->pgno, &r
35d00 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
35d10 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
35d20 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  [i]>pNew->minLoc
35d30 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
35d40 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
35d50 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 69 5d  (pNew, apCell[i]
35d60 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
35d70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
35d80 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f  .    if( !leafCo
35d90 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
35da0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
35db0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
35dc0 20 75 33 32 20 6b 65 79 20 3d 20 67 65 74 34 62   u32 key = get4b
35dd0 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61  yte(&apNew[i]->a
35de0 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20  Data[8]);.      
35df0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
35e00 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f 42 54 52   key, PTRMAP_BTR
35e10 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  EE, apNew[i]->pg
35e20 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  no, &rc);.      
35e30 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
35e40 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70     /* The ptrmap
35e50 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e  CheckPages() con
35e60 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73  tains assert() s
35e70 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76  tatements that v
35e80 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a  erify that.    *
35e90 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61  * all pointer ma
35ea0 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20  p pages are set 
35eb0 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20  correctly. This 
35ec0 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65  is helpful while
35ed0 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69   .    ** debuggi
35ee0 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  ng. This is usua
35ef0 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63  lly disabled bec
35f00 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64  ause a corrupt d
35f10 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20  atabase may.    
35f20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65  ** cause an asse
35f30 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74  rt() statement t
35f40 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20  o fail.  */.    
35f50 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
35f60 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  (apNew, nNew);. 
35f70 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
35f80 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29  ges(&pParent, 1)
35f90 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
35fa0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
35fb0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41  >isInit );.  TRA
35fc0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
35fd0 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e  nished: old=%d n
35fe0 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
35ff0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c  ",.          nOl
36000 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
36010 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65  ;..  /*.  ** Cle
36020 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
36030 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
36040 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
36050 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
36060 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
36070 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
36080 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
36090 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
360a0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
360b0 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
360c0 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
360d0 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  w[i]);.  }..  re
360e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
360f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
36100 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
36110 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
36120 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
36130 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75  ure is.** overfu
36140 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d  ll (has one or m
36150 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
36160 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  es)..**.** A new
36170 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61   child page is a
36180 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
36190 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
361a0 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a   current root.**
361b0 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67   page, including
361c0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c   overflow cells,
361d0 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f   are copied into
361e0 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20   the child. The 
361f0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
36200 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e  then overwritten
36210 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65   to make it an e
36220 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74  mpty page with t
36230 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a  he right-child .
36240 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ** pointer point
36250 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70  ing to the new p
36260 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  age..**.** Befor
36270 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c  e returning, all
36280 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
36290 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
362a0 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20  ng to pages .** 
362b0 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69  that the new chi
362c0 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74  ld-page now cont
362d0 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
362e0 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68   are updated. Th
362f0 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65  e.** entry corre
36300 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
36310 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
36320 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72  pointer of the r
36330 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  oot.** page is a
36340 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  lso updated..**.
36350 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
36360 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  , *ppChild is se
36370 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72  t to contain a r
36380 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
36390 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61  child .** page a
363a0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
363b0 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
363c0 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65  s case the calle
363d0 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  r is required.**
363e0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
363f0 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69  Page() on *ppChi
36400 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e  ld exactly once.
36410 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
36420 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
36430 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
36440 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69  d and *ppChild i
36450 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
36460 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
36470 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
36480 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65   *pRoot, MemPage
36490 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69   **ppChild){.  i
364a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
364b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
364c0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
364d0 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
364e0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
364f0 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
36500 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
36510 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
36520 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
36530 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20  noChild = 0;    
36540 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
36550 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
36560 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
36570 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
36580 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20  = pRoot->pBt;   
36590 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
365a0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ..  assert( pRoo
365b0 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  t->nOverflow>0 )
365c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
365d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
365e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
365f0 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20   /* Make pRoot, 
36600 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
36610 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69   the b-tree, wri
36620 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20  table. Allocate 
36630 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65  a new .  ** page
36640 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
36650 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  e the new right-
36660 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20  child of pPage. 
36670 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
36680 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f  s.  ** of the no
36690 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f  de stored on pRo
366a0 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  ot into the new 
366b0 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f  child page..  */
366c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
366d0 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
366e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
366f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
36700 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  {.    rc = alloc
36710 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
36720 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e 6f 43 68  ,&pChild,&pgnoCh
36730 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c  ild,pRoot->pgno,
36740 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65  0);.    copyNode
36750 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74 2c 20 70  Content(pRoot, p
36760 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a 20 20 20  Child, &rc);.   
36770 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
36780 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
36790 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 43 68  pPut(pBt, pgnoCh
367a0 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  ild, PTRMAP_BTRE
367b0 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20  E, pRoot->pgno, 
367c0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
367d0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
367e0 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20  *ppChild = 0;.  
367f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
36800 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72  hild);.    retur
36810 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
36820 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
36830 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69  Iswriteable(pChi
36840 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ld->pDbPage) );.
36850 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36860 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
36870 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  e(pRoot->pDbPage
36880 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36890 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52  Child->nCell==pR
368a0 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  oot->nCell );.. 
368b0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
368c0 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69  : copy root %d i
368d0 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74  nto %d\n", pRoot
368e0 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e  ->pgno, pChild->
368f0 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f  pgno));..  /* Co
36900 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  py the overflow 
36910 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74  cells from pRoot
36920 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20   to pChild */.  
36930 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
36940 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76  Ovfl, pRoot->aOv
36950 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  fl, pRoot->nOver
36960 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f  flow*sizeof(pRoo
36970 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  t->aOvfl[0]));. 
36980 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
36990 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ow = pRoot->nOve
369a0 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72  rflow;..  /* Zer
369b0 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  o the contents o
369c0 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e  f pRoot. Then in
369d0 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20  stall pChild as 
369e0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e  the right-child.
369f0 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70   */.  zeroPage(p
36a00 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Root, pChild->aD
36a10 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
36a20 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  AF);.  put4byte(
36a30 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
36a40 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
36a50 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a  ], pgnoChild);..
36a60 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68    *ppChild = pCh
36a70 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ild;.  return SQ
36a80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
36a90 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
36aa0 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70  pCur currently p
36ab0 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73  oints to has jus
36ac0 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
36ad0 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20  in.** some way. 
36ae0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  This function fi
36af0 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69  gures out if thi
36b00 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d  s modification m
36b10 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65  eans the.** tree
36b20 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c   needs to be bal
36b30 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f  anced, and if so
36b40 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f   calls the appro
36b50 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67  priate balancing
36b60 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61   .** routine. Ba
36b70 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73  lancing routines
36b80 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61   are:.**.**   ba
36b90 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a  lance_quick().**
36ba0 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65     balance_deepe
36bb0 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65  r().**   balance
36bc0 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74  _nonroot().*/.st
36bd0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
36be0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
36bf0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
36c00 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20  ITE_OK;.  const 
36c10 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d  int nMin = pCur-
36c20 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
36c30 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61   * 2 / 3;.  u8 a
36c40 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
36c50 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72  e[13];.  u8 *pFr
36c60 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f  ee = 0;..  TESTO
36c70 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
36c80 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20  _quick_called = 
36c90 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  0 );.  TESTONLY(
36ca0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65   int balance_dee
36cb0 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29  per_called = 0 )
36cc0 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e  ;..  do {.    in
36cd0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
36ce0 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61  iPage;.    MemPa
36cf0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
36d00 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b  ->apPage[iPage];
36d10 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d  ..    if( iPage=
36d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
36d30 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
36d40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
36d50 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
36d60 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76  the b-tree is ov
36d70 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20  erfull. In this 
36d80 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20  case call the.  
36d90 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65        ** balance
36da0 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69  _deeper() functi
36db0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  on to create a n
36dc0 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65  ew child for the
36dd0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20   root-page.     
36de0 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74     ** and copy t
36df0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
36e00 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  nts of the root-
36e10 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a  page to it. The.
36e20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20          ** next 
36e30 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
36e40 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
36e50 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20  lance the child 
36e60 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  page..        */
36e70 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
36e80 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ( (balance_deepe
36e90 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  r_called++)==0 )
36ea0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  ;.        rc = b
36eb0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50  alance_deeper(pP
36ec0 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61  age, &pCur->apPa
36ed0 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  ge[1]);.        
36ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36ef0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
36f00 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a  Cur->iPage = 1;.
36f10 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
36f20 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20  aiIdx[0] = 0;.  
36f30 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
36f40 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[1] = 0;.    
36f50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
36f60 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e  ur->apPage[1]->n
36f70 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20  Overflow );.    
36f80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
36f90 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e{.        break
36fa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
36fb0 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  lse if( pPage->n
36fc0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
36fd0 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69  Page->nFree<=nMi
36fe0 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  n ){.      break
36ff0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
37000 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e     MemPage * con
37010 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75  st pParent = pCu
37020 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d  r->apPage[iPage-
37030 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f  1];.      int co
37040 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d  nst iIdx = pCur-
37050 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b  >aiIdx[iPage-1];
37060 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
37070 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37080 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
37090 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
370a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66  SQLITE_OK ){.#if
370b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
370c0 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20  _QUICKBALANCE.  
370d0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
370e0 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20  >hasData.       
370f0 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65    && pPage->nOve
37100 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20  rflow==1.       
37110 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66    && pPage->aOvf
37120 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d  l[0].idx==pPage-
37130 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  >nCell.         
37140 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  && pParent->pgno
37150 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=1.         && 
37160 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d  pParent->nCell==
37170 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a  iIdx.        ){.
37180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c            /* Cal
37190 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
371a0 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  ) to create a ne
371b0 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61  w sibling of pPa
371c0 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20  ge on which.    
371d0 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72        ** to stor
371e0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
371f0 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69  ell. balance_qui
37200 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e  ck() inserts a n
37210 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20  ew cell.        
37220 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e    ** into pParen
37230 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75  t, which may cau
37240 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66  se pParent overf
37250 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20  low. If this.   
37260 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e         ** happen
37270 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65  s, the next inte
37280 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
37290 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e  -loop will balan
372a0 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20  ce pParent .    
372b0 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74        ** use eit
372c0 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  her balance_nonr
372d0 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65  oot() or balance
372e0 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c  _deeper(). Until
372f0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
37300 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  ** happens, the 
37310 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73  overflow cell is
37320 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
37330 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
37340 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  e[].          **
37350 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20   buffer. .      
37360 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
37370 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20   ** The purpose 
37380 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
37390 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20   assert() is to 
373a0 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20  check that only 
373b0 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  a.          ** s
373c0 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61  ingle call to ba
373d0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73  lance_quick() is
373e0 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63   made for each c
373f0 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20  all to this.    
37400 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
37410 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20  n. If this were 
37420 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20  not verified, a 
37430 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c  subtle bug invol
37440 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20  ving reuse.     
37450 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61       ** of the a
37460 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
37470 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  e[] might sneak 
37480 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  in..          */
37490 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
374a0 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63  t( (balance_quic
374b0 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29  k_called++)==0 )
374c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
374d0 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70   balance_quick(p
374e0 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61  Parent, pPage, a
374f0 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63  BalanceQuickSpac
37500 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
37510 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  e.#endif.       
37520 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20   {.          /* 
37530 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61  In this case, ca
37540 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ll balance_nonro
37550 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69  ot() to redistri
37560 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20  bute cells.     
37570 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20       ** between 
37580 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
37590 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67  2 of its sibling
375a0 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76   pages. This inv
375b0 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20  olves.          
375c0 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  ** modifying the
375d0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61   contents of pPa
375e0 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
375f0 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f  cause pParent to
37600 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65  .          ** be
37610 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72  come overfull or
37620 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20   underfull. The 
37630 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
37640 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20  f the do-loop.  
37650 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
37660 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
37670 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65  nt page to corre
37680 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20  ct this..       
37690 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20     ** .         
376a0 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e   ** If the paren
376b0 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
376c0 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65  verfull, the ove
376d0 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65  rflow cell or ce
376e0 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lls.          **
376f0 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74   are stored in t
37700 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
37710 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64   allocated immed
37720 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20  iately below. . 
37730 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75           ** A su
37740 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
37750 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
37760 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68  p will deal with
37770 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
37780 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61     ** calling ba
37790 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
377a0 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28  (balance_deeper(
377b0 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20  ) may be called 
377c0 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20  first,.         
377d0 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e   ** but it doesn
377e0 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65  't deal with ove
377f0 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75  rflow cells - ju
37800 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f  st moves them to
37810 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
37820 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e  different page).
37830 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65   Once this subse
37840 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61  quent call to ba
37850 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20  lance_nonroot() 
37860 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
37870 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20  s completed, it 
37880 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61  is safe to relea
37890 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75  se the pSpace bu
378a0 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20  ffer used by.   
378b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72         ** the pr
378c0 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20  evious call, as 
378d0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
378e0 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65  l data will have
378f0 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20   been .         
37900 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65   ** copied eithe
37910 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  r into the body 
37920 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61  of a database pa
37930 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e  ge or into the n
37940 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ew.          ** 
37950 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61  pSpace buffer pa
37960 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74  ssed to the latt
37970 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e  er call to balan
37980 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20  ce_nonroot()..  
37990 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
379a0 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20       u8 *pSpace 
379b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
379c0 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70  loc(pCur->pBt->p
379d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
379e0 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
379f0 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74  _nonroot(pParent
37a00 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20  , iIdx, pSpace, 
37a10 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20  iPage==1);.     
37a20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29       if( pFree )
37a30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
37a40 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74   If pFree is not
37a50 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73   NULL, it points
37a60 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62   to the pSpace b
37a70 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20  uffer used .    
37a80 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20          ** by a 
37a90 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f  previous call to
37aa0 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
37ab0 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73  (). Its contents
37ac0 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20   are.           
37ad0 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65   ** now stored e
37ae0 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61  ither on real da
37af0 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20  tabase pages or 
37b00 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20  within the .    
37b10 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70          ** new p
37b20 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f  Space buffer, so
37b30 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c   it may be safel
37b40 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f  y freed here. */
37b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
37b60 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72  ite3PageFree(pFr
37b70 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ee);.          }
37b80 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
37b90 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72  he pSpace buffer
37ba0 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61   will be freed a
37bb0 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61  fter the next ca
37bc0 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20  ll to.          
37bd0 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  ** balance_nonro
37be0 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65  ot(), or just be
37bf0 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69  fore this functi
37c00 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63  on returns, whic
37c10 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20  hever.          
37c20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20  ** comes first. 
37c30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  */.          pFr
37c40 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20  ee = pSpace;.   
37c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
37c60 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76        pPage->nOv
37c70 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20  erflow = 0;..   
37c80 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69     /* The next i
37c90 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
37ca0 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73  do-loop balances
37cb0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
37cc0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61  . */.      relea
37cd0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
37ce0 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65       pCur->iPage
37cf0 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  --;.    }.  }whi
37d00 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
37d10 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65  K );..  if( pFre
37d20 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
37d30 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b  PageFree(pFree);
37d40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
37d50 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  ;.}.../*.** Inse
37d60 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
37d70 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
37d80 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
37d90 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
37da0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
37db0 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
37dc0 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
37dd0 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
37de0 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
37df0 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
37e00 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
37e10 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
37e20 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
37e30 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
37e40 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
37e50 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
37e60 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
37e70 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
37e80 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
37e90 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
37ea0 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
37eb0 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
37ec0 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
37ed0 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
37ee0 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  th ignored..**.*
37ef0 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73  * If the seekRes
37f00 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
37f10 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
37f20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c  a successful cal
37f30 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f 55 6e  l to.** MovetoUn
37f40 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65 65 6b  packed() to seek
37f50 20 63 75 72 73 6f 72 20 70 43 75 72 20 74 6f 20   cursor pCur to 
37f60 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68 61 73  (pKey, nKey) has
37f70 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e   already.** been
37f80 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65 65 6b   performed. seek
37f90 52 65 73 75 6c 74 20 69 73 20 74 68 65 20 73 65  Result is the se
37fa0 61 72 63 68 20 72 65 73 75 6c 74 20 72 65 74 75  arch result retu
37fb0 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69 76 65  rned (a negative
37fc0 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20 70 43  .** number if pC
37fd0 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
37fe0 65 6e 74 72 79 20 74 68 61 74 20 69 73 20 73 6d  entry that is sm
37ff0 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b 65 79  aller than (pKey
38000 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a 20 61  , nKey), or.** a
38010 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
38020 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  if pCur points a
38030 74 20 61 6e 20 65 74 72 79 20 74 68 61 74 20 69  t an etry that i
38040 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 0a 2a  s larger than .*
38050 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 29 2e  * (pKey, nKey)).
38060 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73   .**.** If the s
38070 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65  eekResult parame
38080 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
38090 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
380a0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
380b0 0a 2a 2a 20 63 75 72 73 6f 72 20 70 43 75 72 20  .** cursor pCur 
380c0 69 73 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  is pointing at t
380d0 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 70 79  he existing copy
380e0 20 6f 66 20 61 20 72 6f 77 20 74 68 61 74 20 69   of a row that i
380f0 73 20 74 6f 20 62 65 0a 2a 2a 20 6f 76 65 72 77  s to be.** overw
38100 72 69 74 74 65 6e 2e 20 20 49 66 20 74 68 65 20  ritten.  If the 
38110 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61 6d  seekResult param
38120 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20  eter is 0, then 
38130 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79 0a  cursor pCur may.
38140 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20  ** point to any 
38150 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f 20 65  entry or to no e
38160 6e 74 72 79 20 61 74 20 61 6c 6c 20 61 6e 64 20  ntry at all and 
38170 73 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  so this function
38180 20 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20   has to seek.** 
38190 74 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72  the cursor befor
381a0 65 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61  e the new key ca
381b0 6e 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a  n be inserted..*
381c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
381d0 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
381e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
381f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
38200 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
38210 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
38220 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
38230 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
38240 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
38250 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
38260 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
38270 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
38280 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
38290 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
382a0 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
382b0 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
382c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
382d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
382e0 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
382f0 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
38300 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c   int appendBias,
38310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38320 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
38330 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
38340 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65  end */.  int see
38350 6b 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20  kResult         
38360 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
38370 74 20 6f 66 20 70 72 69 6f 72 20 4d 6f 76 65 74  t of prior Movet
38380 6f 55 6e 70 61 63 6b 65 64 28 29 20 63 61 6c 6c  oUnpacked() call
38390 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
383a0 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65  .  int loc = see
383b0 6b 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  kResult;        
383c0 20 20 2f 2a 20 2d 31 3a 20 62 65 66 6f 72 65 20    /* -1: before 
383d0 64 65 73 69 72 65 64 20 6c 6f 63 61 74 69 6f 6e  desired location
383e0 20 20 2b 31 3a 20 61 66 74 65 72 20 2a 2f 0a 20    +1: after */. 
383f0 20 69 6e 74 20 73 7a 4e 65 77 20 3d 20 30 3b 0a   int szNew = 0;.
38400 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d    int idx;.  Mem
38410 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42  Page *pPage;.  B
38420 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
38430 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
38440 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
38450 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
38460 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e  r *oldCell;.  un
38470 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77  signed char *new
38480 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Cell = 0;..  if(
38490