/ Hex Artifact Content
Login

Artifact 43581d03fc1b0fc8afa7790a26bf680161394d13:


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 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62    for(iDb=0; iDb
130f0 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29  <db->nDb; iDb++)
13100 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
13110 28 20 61 44 62 5b 69 44 62 5d 2e 70 42 74 20 26  ( aDb[iDb].pBt &
13120 26 20 61 44 62 5b 69 44 62 5d 2e 70 42 74 2d 3e  & aDb[iDb].pBt->
13130 70 42 74 3d 3d 70 42 74 20 29 20 62 72 65 61 6b  pBt==pBt ) break
13140 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13150 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13160 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
13170 20 20 20 20 20 20 20 20 20 69 66 28 20 61 44 62           if( aDb
13180 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c 65 76  [iDb].safety_lev
13190 65 6c 20 21 3d 20 53 51 4c 49 54 45 5f 44 45 46  el != SQLITE_DEF
131a0 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c  AULT_WAL_SAFETYL
131b0 45 56 45 4c 29 20 7b 0a 20 20 20 20 20 20 20 20  EVEL) {.        
131c0 20 20 20 20 61 44 62 5b 69 44 62 5d 2e 73 61 66      aDb[iDb].saf
131d0 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49  ety_level = SQLI
131e0 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
131f0 41 46 45 54 59 4c 45 56 45 4c 3b 0a 20 20 20 20  AFETYLEVEL;.    
13200 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
13210 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
13220 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
13230 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
13240 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 2c 20  AL_SAFETYLEVEL, 
13250 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61          (db->fla
13280 67 73 26 53 51 4c 49 54 45 5f 46 75 6c 6c 46 53  gs&SQLITE_FullFS
13290 79 6e 63 29 21 3d 30 2c 0a 20 20 20 20 20 20 20  ync)!=0,.       
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132c0 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
132d0 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 29  E_CkptFullFSync)
132e0 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
132f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
13300 69 66 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  if.        relea
13310 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13320 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13340 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
13350 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
13360 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
13370 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
13380 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
13390 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
133a0 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
133b0 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
133c0 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
133d0 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
133e0 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
133f0 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
13400 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
13410 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
13420 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
13430 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
13440 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
13450 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
13460 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
13470 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
13480 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
13490 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
134a0 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
134b0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
134c0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
134d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
134e0 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
134f0 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
13500 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
13510 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
13520 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
13530 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
13540 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
13550 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
13560 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
13570 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
13580 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
13590 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
135a0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
135b0 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
135c0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
135d0 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
135e0 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
135f0 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
13600 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
13610 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
13620 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
13630 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
13640 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
13650 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
13660 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
13670 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
13680 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
13690 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
136a0 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
136b0 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
136c0 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
136d0 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
136e0 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
136f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
13700 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
13710 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
13720 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
13730 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
13740 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
13750 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
13760 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
13770 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
13780 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
13790 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
137a0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
137b0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
137c0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
137d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
137e0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
137f0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13800 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
13840 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
13850 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13860 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
13870 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
13880 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
13890 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
138a0 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
138b0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
138c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
138d0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
138e0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
138f0 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
13900 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
13910 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13920 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
13930 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
13940 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
13950 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
13960 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
13970 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13980 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
13990 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
139a0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
139b0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
139c0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
139d0 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
139e0 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
139f0 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
13a00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
13a10 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
13a20 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
13a30 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
13a40 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
13a50 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
13a60 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
13a70 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
13a80 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
13a90 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
13aa0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
13ab0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
13ac0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
13ad0 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
13ae0 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
13af0 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
13b00 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
13b10 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
13b20 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
13b30 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
13b40 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
13b50 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
13b60 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
13b70 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
13b80 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
13b90 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
13ba0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
13bb0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
13bc0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
13bd0 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
13be0 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
13bf0 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
13c00 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
13c10 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
13c20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
13c30 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
13c40 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
13c50 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
13c60 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
13c70 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13c80 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
13c90 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
13ca0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
13cb0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
13cc0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
13cd0 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
13ce0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
13cf0 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
13d00 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
13d10 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
13d20 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
13d30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13d40 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
13d50 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
13d60 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
13d70 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
13d80 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
13d90 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
13da0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
13db0 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
13dc0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
13dd0 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
13de0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
13df0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
13e00 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
13e10 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
13e20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
13e30 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
13e40 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
13e50 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
13e60 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
13e70 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
13e80 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
13e90 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
13ea0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
13eb0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
13ec0 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
13ed0 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
13ee0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
13ef0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
13f00 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
13f10 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
13f20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13f30 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
13f40 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
13f50 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
13f60 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
13f70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13f80 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
13f90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
13fa0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c  Bt->pCursor==0 |
13fb0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
13fc0 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
13fd0 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
13fe0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
13ff0 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
14000 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
14010 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
14020 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
14030 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14040 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
14050 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
14060 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
14070 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
14080 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
14090 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
140a0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
140b0 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
140c0 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
140d0 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
140e0 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
140f0 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
14100 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
14110 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
14120 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
14130 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
14140 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
14150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
14160 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
14170 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
14180 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
14190 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
141a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
141b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
141c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
141d0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
141e0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
141f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14200 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
14210 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
14220 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
14230 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
14240 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
14250 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
14260 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
14270 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14280 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
14290 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
142a0 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
142b0 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
142c0 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
142d0 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
142e0 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
142f0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
14300 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
14310 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
14320 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
14330 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
14340 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
14350 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
14360 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
14370 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
14380 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
14390 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
143a0 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
143b0 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
143c0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
143d0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
143e0 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
143f0 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
14400 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
14410 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
14420 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
14430 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
14440 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
14450 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
14460 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53   );.  pBt->pageS
14470 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
14480 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14490 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
144a0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
144b0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
144c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
144d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
144e0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
144f0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
14500 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
14510 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
14520 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
14530 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
14540 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
14550 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
14560 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
14570 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
14580 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
14590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
145a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
145b0 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
145c0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
145d0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
145e0 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
145f0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
14600 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
14610 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
14620 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
14630 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
14640 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
14650 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
14660 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
14670 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
14680 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
14690 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
146a0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
146b0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
146c0 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
146d0 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
146e0 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
146f0 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
14700 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
14710 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
14720 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
14730 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
14740 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
14750 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
14760 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
14770 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
14780 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
14790 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
147a0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
147b0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
147c0 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
147d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
147e0 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
147f0 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
14800 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
14810 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
14820 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14830 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
14840 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14850 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
14860 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
14870 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
14880 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14890 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
148a0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
148b0 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
148c0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
148d0 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
148e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
148f0 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
14900 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
14910 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
14920 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
14930 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
14940 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
14950 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
14960 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
14970 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
14980 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
14990 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
149a0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
149b0 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
149c0 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
149d0 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
149e0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
149f0 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
14a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14a10 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
14a20 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
14a30 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
14a40 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
14a50 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
14a60 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
14a70 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
14a80 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
14a90 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
14aa0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
14ab0 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
14ac0 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
14ad0 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
14ae0 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
14af0 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
14b00 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
14b10 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
14b20 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
14b30 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
14b40 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
14b50 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
14b60 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
14b70 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
14b80 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
14b90 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
14ba0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
14bb0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
14bc0 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
14bd0 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
14be0 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
14bf0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
14c00 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
14c10 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
14c20 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
14c30 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
14c40 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
14c50 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
14c60 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
14c70 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
14c80 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
14c90 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14ca0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14cb0 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
14cc0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
14cd0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
14ce0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
14cf0 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
14d00 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
14d10 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
14d20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
14d30 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
14d40 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
14d50 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
14d60 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
14d70 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
14d80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
14d90 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
14da0 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
14db0 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
14dc0 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
14dd0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
14de0 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  un;.  }..  /* Wr
14df0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
14e00 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
14e10 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
14e20 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
14e30 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
14e40 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
14e50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
14e60 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
14e70 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
14e80 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
14e90 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
14ea0 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74  CHE.  /* If anot
14eb0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
14ec0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
14ed0 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
14ee0 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
14ef0 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
14f00 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
14f10 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
14f20 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
14f30 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
14f40 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
14f50 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69  LOCKED..  */.  i
14f60 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
14f70 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
14f80 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c  ==TRANS_WRITE) |
14f90 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67  | pBt->isPending
14fa0 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
14fb0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
14fc0 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
14fd0 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
14fe0 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
14ff0 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
15000 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
15010 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
15020 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
15030 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
15040 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
15050 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
15060 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
15070 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
15080 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
15090 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
150a0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
150b0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
150c0 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
150d0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
150e0 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
150f0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
15100 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
15110 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
15120 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
15130 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
15140 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
15150 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
15160 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
15170 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
15180 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
15190 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
151a0 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
151b0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
151c0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
151d0 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
151e0 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
151f0 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
15200 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
15210 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
15220 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
15230 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69  gun;..  pBt->ini
15240 74 69 61 6c 6c 79 45 6d 70 74 79 20 3d 20 28 75  tiallyEmpty = (u
15250 38 29 28 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  8)(pBt->nPage==0
15260 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  );.  do {.    /*
15270 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
15280 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
15290 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
152a0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
152b0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
152c0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
152d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
152e0 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
152f0 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
15300 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
15310 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
15320 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
15330 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
15340 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
15350 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
15360 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
15370 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
15380 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
15390 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
153a0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
153b0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
153c0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
153d0 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
153e0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
153f0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
15400 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
15410 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
15420 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
15430 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
15440 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
15450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15460 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
15470 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
15480 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
15490 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
154a0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
154b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
154c0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
154d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
154e0 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
154f0 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
15500 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15520 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
15530 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
15540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15550 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
15560 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15570 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
15580 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
15590 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
155a0 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
155b0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
155c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
155d0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
155e0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
155f0 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
15600 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
15610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15620 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
15630 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
15640 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
15650 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
15660 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15670 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
15680 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
15690 61 62 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28  able ){..assert(
156a0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
156b0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
156c0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
156d0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
156e0 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
156f0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
15700 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
15710 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
15720 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
15730 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
15740 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
15750 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
15760 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
15770 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
15780 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
15790 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
157a0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
157b0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
157c0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
157d0 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
157e0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
157f0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
15800 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
15810 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15820 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
15830 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
15840 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
15850 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
15860 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73     pBt->isExclus
15870 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61  ive = (u8)(wrfla
15880 67 3e 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  g>1);.#endif..  
15890 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
158a0 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
158b0 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
158c0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
158d0 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
158e0 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
158f0 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
15900 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
15910 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
15920 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
15930 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
15940 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
15950 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
15960 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
15970 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
15980 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
15990 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
159a0 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
159b0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
159c0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
159d0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
159e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
159f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
15a00 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
15a10 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
15a20 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
15a30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15a40 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
15a50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
15a60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15a80 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
15a90 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
15aa0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
15ab0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15ac0 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
15ad0 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
15ae0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
15af0 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
15b00 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
15b10 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
15b20 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
15b30 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
15b40 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
15b50 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
15b60 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
15b70 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
15b80 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
15b90 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
15ba0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
15bb0 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
15bc0 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
15bd0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
15be0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
15bf0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
15c00 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
15c10 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
15c20 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
15c30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15c40 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15c50 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
15c60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15c70 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
15c80 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
15c90 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
15ca0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
15cb0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
15cc0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
15cd0 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
15ce0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
15cf0 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
15d00 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
15d10 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
15d20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
15d30 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
15d40 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
15d50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
15d60 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d90 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
15da0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15dd0 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
15de0 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
15df0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
15e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e10 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
15e20 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
15e30 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
15e40 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
15e50 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
15e60 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
15e70 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
15e80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15e90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
15ea0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
15eb0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
15ec0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
15ed0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15ee0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
15ef0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
15f00 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
15f10 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
15f20 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
15f30 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
15f40 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
15f50 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
15f60 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
15f70 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
15f80 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
15f90 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
15fa0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
15fb0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
15fc0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
15fd0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
15fe0 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
15ff0 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
16000 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
16010 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
16020 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
16030 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
16040 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
16050 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
16060 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
16070 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
16080 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
16090 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
160a0 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
160b0 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
160c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
160d0 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
160e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
160f0 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
16100 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
16110 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
16120 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
16130 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
16140 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
16150 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
16160 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
16170 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
16180 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
16190 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
161a0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
161b0 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
161c0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
161d0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
161e0 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
16210 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
16220 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
16230 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
16240 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
16250 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
16260 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
16270 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
16280 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
16290 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
162a0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
162b0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
162c0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
162d0 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
162e0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
162f0 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
16310 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
16320 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
16330 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
16340 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
16350 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
16360 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
16370 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
16380 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16390 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
163a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
163b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
163c0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
163d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
163e0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
163f0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
16400 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
16410 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
16420 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
16430 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
16440 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
16450 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
16460 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
16470 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
16480 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
16490 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
164a0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
164b0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
164c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
164d0 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
164e0 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
164f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
16500 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65  nCell;..    btre
16510 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
16520 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
16530 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
16540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
16550 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
16560 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
16570 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
16580 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
16590 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
165a0 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
165b0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
165c0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
165d0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
165e0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
165f0 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
16600 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
16610 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
16620 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
16630 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29  fo.iOverflow]) )
16640 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
16650 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
16660 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69  fo.iOverflow], i
16670 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  To);.           
16680 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16690 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
166a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
166b0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
166c0 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b  pCell)==iFrom ){
166d0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
166e0 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b  yte(pCell, iTo);
166f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
16700 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16710 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
16720 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b   if( i==nCell ){
16730 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
16740 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  !=PTRMAP_BTREE |
16750 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74  | .          get
16760 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
16770 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
16780 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20  fset+8])!=iFrom 
16790 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
167a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
167b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
167c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
167d0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
167e0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
167f0 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   iTo);.    }..  
16800 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
16810 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
16820 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16830 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
16840 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61  Move the open da
16850 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
16860 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  age to location 
16870 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65  iFreePage in the
16880 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54   .** database. T
16890 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72  he pDbPage refer
168a0 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c  ence remains val
168b0 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73  id..**.** The is
168c0 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69  Commit flag indi
168d0 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65  cates that there
168e0 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72   is no need to r
168f0 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20  emember that.** 
16900 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64  the journal need
16910 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64  s to be sync()ed
16920 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65   before database
16930 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70   page pDbPage->p
16940 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77  gno .** can be w
16950 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63  ritten to. The c
16960 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
16970 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74  y promised not t
16980 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a  o write to that.
16990 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ** page..*/.stat
169a0 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50  ic int relocateP
169b0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
169c0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
169d0 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65  /* Btree */.  Me
169e0 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20  mPage *pDbPage, 
169f0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70         /* Open p
16a00 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20  age to move */. 
16a10 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20   u8 eType,      
16a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
16a30 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20  nter map 'type' 
16a40 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
16a50 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72  e */.  Pgno iPtr
16a60 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
16a70 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
16a80 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66  page-no' entry f
16a90 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
16aa0 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20  Pgno iFreePage, 
16ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16ac0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65  location to move
16ad0 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20   pDbPage to */. 
16ae0 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20   int isCommit   
16af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43            /* isC
16b00 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65  ommit flag passe
16b10 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  d to sqlite3Page
16b20 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a  rMovepage */.){.
16b30 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
16b40 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
16b50 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
16b60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
16b70 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
16b80 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
16b90 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
16ba0 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
16bb0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
16bc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
16bd0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
16be0 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
16bf0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
16c00 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
16c10 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
16c20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
16c30 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
16c40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16c50 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
16c60 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
16c70 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
16c80 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
16c90 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
16ca0 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
16cb0 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
16cc0 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
16cd0 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
16ce0 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
16cf0 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
16d00 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
16d10 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
16d20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
16d30 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
16d40 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
16d50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
16d60 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
16d70 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
16d80 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43  , iFreePage, isC
16d90 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63  ommit);.  if( rc
16da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16db0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16dc0 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  }.  pDbPage->pgn
16dd0 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a  o = iFreePage;..
16de0 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20    /* If pDbPage 
16df0 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65  was a btree-page
16e00 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61  , then it may ha
16e10 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61  ve child pages a
16e20 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  nd/or cells.  **
16e30 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
16e40 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54  verflow pages. T
16e50 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
16e60 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74  ntries for all t
16e70 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20  hese.  ** pages 
16e80 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67  need to be chang
16e90 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ed..  **.  ** If
16ea0 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f   pDbPage is an o
16eb0 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
16ec0 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62  en the first 4 b
16ed0 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61  ytes may store a
16ee0 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f  .  ** pointer to
16ef0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76   a subsequent ov
16f00 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
16f10 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
16f20 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  , then.  ** the 
16f30 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64  pointer map need
16f40 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  s to be updated 
16f50 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65  for the subseque
16f60 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
16f70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
16f80 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
16f90 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
16fa0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
16fb0 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50    rc = setChildP
16fc0 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b  trmaps(pDbPage);
16fd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
16fe0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16ff0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
17000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
17010 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65  no nextOvfl = ge
17020 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e  t4byte(pDbPage->
17030 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  aData);.    if( 
17040 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20  nextOvfl!=0 ){. 
17050 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
17060 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
17070 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
17080 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b  iFreePage, &rc);
17090 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
170a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
170b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
170c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
170d0 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64  ..  /* Fix the d
170e0 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20  atabase pointer 
170f0 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65  on page iPtrPage
17100 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74   that pointed at
17110 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a   iDbPage so.  **
17120 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
17130 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c  at iFreePage. Al
17140 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74  so fix the point
17150 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
17160 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a  .  ** iPtrPage..
17170 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
17180 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  !=PTRMAP_ROOTPAG
17190 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  E ){.    rc = bt
171a0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
171b0 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50  iPtrPage, &pPtrP
171c0 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
171d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
171e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
171f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
17200 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
17210 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44  ite(pPtrPage->pD
17220 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
17230 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17240 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
17250 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
17260 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17270 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
17280 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
17290 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67  pPtrPage, iDbPag
172a0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  e, iFreePage, eT
172b0 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ype);.    releas
172c0 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b  ePage(pPtrPage);
172d0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
172e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
172f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
17300 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c  FreePage, eType,
17310 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b   iPtrPage, &rc);
17320 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17330 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
17340 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
17350 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e  n required by in
17360 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20  crVacuumStep(). 
17370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
17380 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
17390 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50  BtShared *, MemP
173a0 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20  age **, Pgno *, 
173b0 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a  Pgno, u8);../*.*
173c0 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67  * Perform a sing
173d0 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e  le step of an in
173e0 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d  cremental-vacuum
173f0 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  . If successful,
17400 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54  .** return SQLIT
17410 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69  E_OK. If there i
17420 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20  s no work to do 
17430 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e  (and therefore n
17440 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61  o.** point in ca
17450 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
17460 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
17470 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
17480 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
17490 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63  ficly, this func
174a0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
174b0 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65   re-organize the
174c0 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f   .** database so
174d0 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70   that the last p
174e0 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  age of the file 
174f0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
17500 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
17510 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49   in use..**.** I
17520 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d  f the nFin param
17530 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
17540 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
17550 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20  assumes.** that 
17560 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
17570 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
17580 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
17590 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e  til.** it return
175a0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  s SQLITE_DONE or
175b0 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
175c0 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a  hat nFin is the.
175d0 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  ** number of pag
175e0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
175f0 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69  file will contai
17600 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a  n after this .**
17610 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70   process is comp
17620 6c 65 74 65 2e 20 20 49 66 20 6e 46 69 6e 20 69  lete.  If nFin i
17630 73 20 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  s zero, it is as
17640 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 69 6e  sumed that.** in
17650 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 77  crVacuumStep() w
17660 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 20  ill be called a 
17670 66 69 6e 69 74 65 20 61 6d 6f 75 6e 74 20 6f 66  finite amount of
17680 20 74 69 6d 65 73 0a 2a 2a 20 77 68 69 63 68 20   times.** which 
17690 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 65  may or may not e
176a0 6d 70 74 79 20 74 68 65 20 66 72 65 65 6c 69 73  mpty the freelis
176b0 74 2e 20 20 41 20 66 75 6c 6c 20 61 75 74 6f 76  t.  A full autov
176c0 61 63 75 75 6d 0a 2a 2a 20 68 61 73 20 6e 46 69  acuum.** has nFi
176d0 6e 3e 30 2e 20 20 41 20 22 50 52 41 47 4d 41 20  n>0.  A "PRAGMA 
176e0 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75  incremental_vacu
176f0 75 6d 22 20 68 61 73 20 6e 46 69 6e 3d 3d 30 2e  um" has nFin==0.
17700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
17710 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
17720 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
17730 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61  o nFin, Pgno iLa
17740 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  stPg){.  Pgno nF
17750 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
17760 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17770 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
17780 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
17790 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
177a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
177b0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
177c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
177d0 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
177e0 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
177f0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
17800 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
17810 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
17820 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
17830 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
17840 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
17850 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
17860 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
17870 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
17880 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
17890 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
178a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
178b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
178c0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
178d0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
178e0 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
178f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17900 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
17910 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
17920 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
17930 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
17940 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
17950 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
17960 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
17970 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
17980 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
17990 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
179a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
179b0 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
179c0 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
179d0 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
179e0 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
179f0 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20    ** if nFin is 
17a00 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
17a10 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
17a20 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
17a30 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
17a40 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
17a50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
17a60 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
17a70 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
17a80 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
17a90 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
17aa0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
17ab0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
17ac0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
17ad0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
17ae0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
17af0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
17b00 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
17b10 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
17b20 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
17b30 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
17b40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17b50 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17b60 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
17b70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17b80 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
17b90 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
17ba0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
17bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
17bc0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
17bd0 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
17be0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
17bf0 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
17c00 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
17c10 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
17c20 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20   *pLastPg;..    
17c30 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
17c40 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
17c50 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
17c60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17c70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17c80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17c90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17ca0 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c  If nFin is zero,
17cb0 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
17cc0 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
17cd0 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
17ce0 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
17cf0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
17d00 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
17d10 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
17d20 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
17d30 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
17d40 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69  her hand, if nFi
17d50 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  n is greater tha
17d60 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
17d70 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
17d80 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
17d90 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
17da0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
17db0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
17dc0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
17dd0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
17de0 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
17df0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
17e00 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
17e10 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
17e20 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
17e30 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c  Pg, &iFreePg, 0,
17e40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
17e50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17e60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
17e70 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
17e80 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
17e90 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
17ea0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
17eb0 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
17ec0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69       }while( nFi
17ed0 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e  n!=0 && iFreePg>
17ee0 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
17ef0 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
17f00 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
17f10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17f20 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61  e3PagerWrite(pLa
17f30 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  stPg->pDbPage);.
17f40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
17f50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17f60 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
17f70 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
17f80 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
17f90 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69  ge, iFreePg, nFi
17fa0 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n!=0);.      }. 
17fb0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
17fc0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
17fd0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17fe0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
17ff0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
18000 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
18010 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
18020 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
18030 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d  while( iLastPg==
18040 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
18050 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49  E(pBt)||PTRMAP_I
18060 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
18070 50 67 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Pg) ){.      if(
18080 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
18090 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a  Bt, iLastPg) ){.
180a0 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
180b0 2a 70 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  *pPg;.        rc
180c0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
180d0 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
180e0 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 0);.        
180f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18100 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
18110 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18120 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
18130 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
18140 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
18150 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
18160 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
18170 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18180 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
181a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
181b0 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b        iLastPg--;
181c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
181d0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
181e0 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
181f0 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  , iLastPg);.    
18200 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
18210 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
18220 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18230 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
18240 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
18250 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
18260 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
18270 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
18280 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
18290 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
182a0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
182b0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
182c0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
182d0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
182e0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
182f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
18300 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
18310 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
18320 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
18330 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
18340 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
18350 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
18360 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
18370 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
18380 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
18390 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
183a0 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
183b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
183c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
183d0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
183e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
183f0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
18400 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
18410 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
18420 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
18430 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
18440 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
18450 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18460 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
18470 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41  .    invalidateA
18480 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
18490 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 69  pBt);.    rc = i
184a0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
184b0 74 2c 20 30 2c 20 62 74 72 65 65 50 61 67 65 63  t, 0, btreePagec
184c0 6f 75 6e 74 28 70 42 74 29 29 3b 0a 20 20 20 20  ount(pBt));.    
184d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
184e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
184f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
18500 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
18510 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
18520 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
18530 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
18540 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
18550 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18560 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18580 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
18590 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
185a0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
185b0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
185c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
185d0 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
185e0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
185f0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
18600 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
18610 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
18620 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
18630 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
18640 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
18650 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
18660 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
18670 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
18680 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
18690 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
186a0 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
186b0 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
186c0 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
186d0 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
186e0 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
186f0 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
18700 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
18710 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
18720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18730 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
18740 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
18750 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
18760 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
18770 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
18780 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
18790 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
187a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
187b0 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
187c0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
187d0 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
187e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
187f0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
18800 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
18810 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
18820 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
18830 61 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65  ages in database
18840 20 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75   after autovacuu
18850 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ming */.    Pgno
18860 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f   nFree;        /
18870 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
18880 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
18890 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20  t initially */. 
188a0 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b     Pgno nPtrmap;
188b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
188c0 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20  of PtrMap pages 
188d0 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20  to be freed */. 
188e0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20     Pgno iFree;  
188f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
18900 74 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65  t page to be fre
18910 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ed */.    int nE
18920 6e 74 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  ntry;        /* 
18930 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
18940 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
18950 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
18960 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
18970 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
18980 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
18990 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
189a0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
189b0 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
189c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
189d0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
189e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
189f0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
18a00 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
18a10 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
18a20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
18a30 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
18a40 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
18a50 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
18a60 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
18a70 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
18a80 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
18a90 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
18aa0 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
18ab0 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
18ac0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
18ad0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
18ae0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
18af0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
18b00 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
18b10 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
18b20 20 20 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74      nEntry = pBt
18b30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a  ->usableSize/5;.
18b40 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
18b50 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
18b60 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
18b70 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
18b80 74 72 79 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  try;.    nFin = 
18b90 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
18ba0 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69 66 28  nPtrmap;.    if(
18bb0 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
18bc0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
18bd0 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
18be0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
18bf0 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
18c00 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 50    }.    while( P
18c10 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
18c20 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
18c30 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
18c40 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
18c50 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20   nFin--;.    }. 
18c60 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69     if( nFin>nOri
18c70 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  g ) return SQLIT
18c80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18c90 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
18ca0 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
18cb0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
18cc0 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
18cd0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
18ce0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
18cf0 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20 7d 0a  , iFree);.    }.
18d00 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
18d10 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
18d20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
18d30 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
18d40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18d50 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
18d60 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
18d70 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
18d80 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
18d90 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
18da0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
18db0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
18dc0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
18dd0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
18de0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
18df0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
18e00 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
18e10 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
18e20 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42   nFin);.      pB
18e30 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
18e40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
18e50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
18e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
18e70 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
18e80 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
18e90 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
18ea0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
18eb0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
18ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
18ed0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
18ee0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18ef0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
18f00 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
18f10 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
18f20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
18f30 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
18f40 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
18f50 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
18f60 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
18f70 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
18f80 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
18f90 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
18fa0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
18fb0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
18fc0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
18fd0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
18fe0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
18ff0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
19000 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
19010 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
19020 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
19030 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
19040 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
19050 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
19060 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
19070 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
19080 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
19090 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
190a0 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
190b0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
190c0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
190d0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
190e0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
190f0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
19100 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
19110 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
19120 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
19130 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
19140 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
19150 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
19160 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
19170 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
19180 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
19190 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
191a0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
191b0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
191c0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
191d0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
191e0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
191f0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
19200 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
19210 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
19220 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
19230 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
19240 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
19250 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
19260 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
19270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
19280 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
19290 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
192a0 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
192b0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
192c0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
192d0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
192e0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
192f0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
19300 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
19310 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
19320 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
19330 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
19340 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
19350 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
19360 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
19370 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
19380 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
19390 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
193a0 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
193b0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
193c0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
193d0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
193e0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
193f0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
19400 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
19410 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
19420 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
19430 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
19440 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
19450 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
19460 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
19470 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
19480 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
19490 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
194a0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
194b0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
194c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
194d0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
194e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
194f0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
19500 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
19510 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19520 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
19530 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
19540 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
19550 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
19560 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
19570 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
19580 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19590 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
195a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
195b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
195c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
195d0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
195e0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
195f0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
19600 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
19610 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
19620 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19630 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
19640 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19650 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
19660 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
19670 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
19680 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
19690 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
196a0 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
196b0 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
196c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
196d0 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
196e0 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
196f0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
19700 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19710 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19720 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
19730 70 29 20 29 3b 0a 0a 20 20 62 74 72 65 65 43 6c  p) );..  btreeCl
19740 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
19750 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  t);.  if( p->inT
19760 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  rans>TRANS_NONE 
19770 26 26 20 70 2d 3e 64 62 2d 3e 61 63 74 69 76 65  && p->db->active
19780 56 64 62 65 43 6e 74 3e 31 20 29 7b 0a 20 20 20  VdbeCnt>1 ){.   
19790 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
197a0 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
197b0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
197c0 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
197d0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
197e0 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
197f0 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
19800 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
19810 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
19820 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
19830 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
19840 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
19850 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
19860 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
19870 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
19880 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
19890 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
198a0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
198b0 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
198c0 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
198d0 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
198e0 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
198f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
19900 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
19910 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
19920 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
19930 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
19940 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
19950 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
19960 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
19970 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
19980 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
19990 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
199a0 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
199b0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
199c0 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
199d0 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
199e0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
199f0 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
19a00 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
19a10 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
19a20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
19a30 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
19a40 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
19a50 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
19a60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
19a70 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
19a80 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
19a90 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
19aa0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
19ab0 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
19ac0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
19ad0 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
19ae0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
19af0 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
19b00 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
19b10 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
19b20 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
19b30 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
19b40 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
19b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
19b60 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
19b70 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
19b80 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
19b90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
19ba0 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
19bb0 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
19bc0 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
19bd0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
19be0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
19bf0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
19c00 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
19c10 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
19c20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
19c30 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
19c40 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
19c50 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
19c60 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
19c70 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
19c80 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
19c90 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
19ca0 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
19cb0 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
19cc0 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
19cd0 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
19ce0 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
19cf0 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
19d00 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
19d10 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
19d20 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
19d30 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
19d40 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
19d50 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
19d60 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
19d70 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
19d80 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
19d90 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
19da0 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
19db0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
19dc0 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
19dd0 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
19de0 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
19df0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
19e00 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
19e10 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
19e20 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
19e30 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
19e40 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
19e50 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
19e60 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
19e70 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
19e80 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
19e90 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
19ea0 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
19eb0 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
19ec0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
19ed0 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
19ee0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
19ef0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
19f00 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
19f10 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
19f20 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
19f30 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
19f40 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
19f50 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
19f60 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
19f70 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
19f80 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
19f90 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
19fa0 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
19fb0 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
19fc0 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
19fd0 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
19fe0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
19ff0 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
1a000 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
1a010 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
1a020 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
1a030 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
1a040 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
1a050 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1a060 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1a070 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1a080 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1a090 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1a0a0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1a0b0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1a0c0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1a0d0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1a0e0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1a0f0 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
1a100 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
1a110 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1a120 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
1a130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a140 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a150 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
1a160 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
1a170 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1a180 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
1a190 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
1a1a0 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
1a1b0 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
1a1c0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
1a1d0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1a1e0 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
1a1f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1a200 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1a210 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1a220 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
1a230 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1a240 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1a250 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1a260 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1a270 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1a280 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
1a290 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a2a0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1a2b0 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
1a2c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1a2d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
1a2e0 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
1a2f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1a300 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
1a310 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1a320 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1a330 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
1a340 44 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  D;.  }..  btreeE
1a350 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
1a360 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a370 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1a380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a390 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70  ./*.** Do both p
1a3a0 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69  hases of a commi
1a3b0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
1a3c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72  3BtreeCommit(Btr
1a3d0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1a3e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a3f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1a400 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1a410 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30  mitPhaseOne(p, 0
1a420 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1a430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1a440 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
1a450 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c  ommitPhaseTwo(p,
1a460 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1a470 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a480 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a490 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1a4a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1a4b0 20 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65   number of write
1a4c0 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e  -cursors open on
1a4d0 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68   this handle. Th
1a4e0 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
1a4f0 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
1a500 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
1a510 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
1a520 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
1a530 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
1a540 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
1a550 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
1a560 74 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75  tine, a write-cu
1a570 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1a580 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1a590 70 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67  pable of writing
1a5a0 20 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e   to the databse.
1a5b0 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65    That means the
1a5c0 20 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f   cursor was.** o
1a5d0 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64  riginally opened
1a5e0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64   for writing and
1a5f0 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
1a600 6e 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a  not be disabled.
1a610 2a 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73  ** by having its
1a620 20 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74   state changed t
1a630 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a  o CURSOR_FAULT..
1a640 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1a650 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
1a660 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1a670 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1a680 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
1a690 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
1a6a0 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
1a6b0 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
1a6c0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77  .    if( pCur->w
1a6d0 72 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65  rFlag && pCur->e
1a6e0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
1a6f0 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
1a700 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
1a710 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
1a720 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
1a730 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
1a740 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
1a750 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
1a760 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
1a770 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53  ry cursor on BtS
1a780 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1a790 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1a7a0 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72  .**.** Every cur
1a7b0 73 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20  sor is tripped, 
1a7c0 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
1a7d0 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a  s that belong.**
1a7e0 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
1a7f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
1a800 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
1a810 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20   sharing.** the 
1a820 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
1a830 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1a840 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
1a850 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
1a860 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c  k occurs..** All
1a870 20 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74   cursors using t
1a880 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75  he same cache mu
1a890 73 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a  st be tripped.**
1a8a0 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d   to prevent them
1a8b0 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
1a8c0 75 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66  use the btree af
1a8d0 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ter.** the rollb
1a8e0 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61  ack.  The rollba
1a8f0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65  ck may have dele
1a900 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72  ted tables.** or
1a910 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65   moved root page
1a920 73 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20  s, so it is not 
1a930 73 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a  sufficient to.**
1a940 20 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20   save the state 
1a950 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
1a960 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
1a970 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1a980 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1a990 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1a9a0 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
1a9b0 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
1a9c0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1a9d0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1a9e0 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
1a9f0 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1aa00 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1aa10 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1aa20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 71 6c 69   int i;.    sqli
1aa30 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1aa40 73 6f 72 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65  sor(p);.    p->e
1aa50 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
1aa60 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69  AULT;.    p->ski
1aa70 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
1aa80 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1aa90 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
1aaa0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1aab0 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
1aac0 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67  ;.      p->apPag
1aad0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
1aae0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
1aaf0 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
1ab00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1ab10 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
1ab20 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
1ab30 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
1ab40 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
1ab50 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
1ab60 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
1ab70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
1ab80 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
1ab90 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
1aba0 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
1abb0 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
1abc0 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
1abd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1abe0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1abf0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1ac00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1ac10 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1ac20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1ac30 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1ac40 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1ac50 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1ac60 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
1ac70 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1ac80 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1ac90 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1aca0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1acb0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1acc0 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
1acd0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
1ace0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
1acf0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ad00 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
1ad10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ad20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
1ad30 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
1ad40 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
1ad50 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
1ad60 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
1ad70 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
1ad80 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
1ad90 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
1ada0 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
1adb0 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
1adc0 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
1add0 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
1ade0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
1adf0 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
1ae00 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
1ae10 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
1ae20 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
1ae30 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
1ae40 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
1ae50 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
1ae60 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
1ae70 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
1ae80 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
1ae90 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
1aea0 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
1aeb0 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
1aec0 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
1aed0 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
1aee0 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
1aef0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
1af00 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
1af10 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rc);.  }.#endif.
1af20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
1af30 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
1af40 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1af50 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1af60 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
1af70 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
1af80 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1af90 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
1afa0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1afb0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
1afc0 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
1afd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1afe0 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
1aff0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
1b000 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
1b010 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
1b020 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
1b030 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
1b040 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  l btreeGetPage()
1b050 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
1b060 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
1b070 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
1b080 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
1b090 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
1b0a0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1b0b0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
1b0c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b0d0 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d       int nPage =
1b0e0 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38   get4byte(28+(u8
1b0f0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  *)pPage1->aData)
1b100 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1b110 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ( nPage==0 );.  
1b120 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
1b130 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   ) sqlite3PagerP
1b140 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1b150 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
1b160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1b170 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65  Bt->nPage!=nPage
1b180 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   );.      pBt->n
1b190 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1b1a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1b1b0 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
1b1c0 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
1b1d0 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
1b1e0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
1b1f0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1b200 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
1b210 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
1b220 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
1b230 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b240 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1b250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
1b260 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
1b270 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1b280 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
1b290 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  an can be rolled
1b2a0 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
1b2b0 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
1b2c0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
1b2d0 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
1b2e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
1b2f0 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
1b300 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
1b310 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1b320 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
1b330 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
1b340 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
1b350 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
1b360 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
1b370 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
1b380 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
1b390 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
1b3a0 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
1b3b0 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
1b3c0 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
1b3d0 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
1b3e0 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
1b3f0 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
1b400 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
1b410 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
1b420 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
1b430 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
1b440 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
1b450 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
1b460 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
1b470 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
1b480 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
1b490 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
1b4a0 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
1b4b0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
1b4c0 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
1b4d0 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
1b4e0 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
1b4f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
1b500 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
1b510 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
1b520 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
1b530 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
1b540 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1b550 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
1b560 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
1b570 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1b580 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
1b590 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
1b5a0 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
1b5b0 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
1b5c0 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
1b5d0 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
1b5e0 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
1b5f0 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
1b600 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
1b610 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
1b620 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
1b630 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1b640 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1b650 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
1b660 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
1b670 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1b680 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1b690 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
1b6a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1b6b0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
1b6c0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1b6d0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1b6e0 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
1b6f0 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
1b700 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
1b710 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
1b720 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
1b730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
1b740 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1b750 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1b760 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
1b770 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
1b780 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1b790 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
1b7a0 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  with.  ** an ind
1b7b0 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ex greater than 
1b7c0 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63  all savepoints c
1b7d0 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c  reated explicitl
1b7e0 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c  y using.  ** SQL
1b7f0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
1b800 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
1b810 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
1b820 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a  ollback any.  **
1b830 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73   such savepoints
1b840 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65   while the state
1b850 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1b860 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63   savepoint is ac
1b870 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tive..  */.  rc 
1b880 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1b890 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1b8a0 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d  >pPager, iStatem
1b8b0 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ent);.  sqlite3B
1b8c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b8d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b8e0 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61  .** The second a
1b8f0 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1b900 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73  function, op, is
1b910 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e   always SAVEPOIN
1b920 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72  T_ROLLBACK.** or
1b930 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
1b940 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  SE. This functio
1b950 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65  n either release
1b960 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20  s or rolls back 
1b970 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  the.** savepoint
1b980 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1b990 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f  arameter iSavepo
1b9a0 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  int, depending o
1b9b0 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20  n the value .** 
1b9c0 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  of op..**.** Nor
1b9d0 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e  mally, iSavepoin
1b9e0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1b9f0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
1ba00 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  ro. However, if 
1ba10 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49  op is.** SAVEPOI
1ba20 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
1ba30 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79  n iSavepoint may
1ba40 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20   also be -1. In 
1ba50 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a  this case the .*
1ba60 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1ba70 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
1ba80 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20  tion are rolled 
1ba90 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69  back. This is di
1baa0 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20  fferent.** from 
1bab0 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63  a normal transac
1bac0 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61  tion rollback, a
1bad0 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72  s no locks are r
1bae0 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a  eleased and the.
1baf0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  ** transaction r
1bb00 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a  emains open..*/.
1bb10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1bb20 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20  Savepoint(Btree 
1bb30 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  *p, int op, int 
1bb40 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
1bb50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bb60 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d  K;.  if( p && p-
1bb70 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1bb80 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
1bb90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1bba0 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
1bbb0 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
1bbc0 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41  ELEASE || op==SA
1bbd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
1bbe0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1bbf0 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c  iSavepoint>=0 ||
1bc00 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31   (iSavepoint==-1
1bc10 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   && op==SAVEPOIN
1bc20 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20  T_ROLLBACK) );. 
1bc30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1bc40 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20  nter(p);.    rc 
1bc50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61  = sqlite3PagerSa
1bc60 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1bc70 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f  ger, op, iSavepo
1bc80 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  int);.    if( rc
1bc90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bca0 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
1bcb0 69 6e 74 3c 30 20 26 26 20 70 42 74 2d 3e 69 6e  int<0 && pBt->in
1bcc0 69 74 69 61 6c 6c 79 45 6d 70 74 79 20 29 20 70  itiallyEmpty ) p
1bcd0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
1bce0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1bcf0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1bd00 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1bd10 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1bd20 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1bd30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
1bd40 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1bd50 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1bd60 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
1bd70 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
1bd80 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
1bd90 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1bda0 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
1bdb0 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
1bdc0 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
1bdd0 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
1bde0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bdf0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
1be00 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1be10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1be20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1be30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1be40 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1be50 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1be60 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1be70 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1be80 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1be90 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1bea0 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1beb0 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1bec0 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1bed0 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1bee0 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1bef0 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1bf00 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1bf10 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1bf20 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1bf30 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1bf40 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1bf50 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1bf60 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1bf70 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1bf80 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1bf90 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1bfa0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1bfb0 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1bfc0 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1bfd0 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1bfe0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1bff0 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1c000 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1c010 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1c020 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1c030 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1c040 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1c050 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1c060 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1c070 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1c080 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1c090 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1c0a0 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1c0b0 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1c0c0 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1c0d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1c0e0 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1c0f0 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1c100 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1c110 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1c120 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1c130 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1c140 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1c150 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1c160 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1c170 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1c180 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1c190 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1c1a0 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1c1b0 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1c1c0 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1c1d0 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1c1e0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1c1f0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1c200 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1c210 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1c220 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1c230 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
1c240 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
1c250 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
1c260 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
1c270 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
1c280 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
1c290 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
1c2a0 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
1c2b0 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
1c2c0 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
1c2d0 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
1c2e0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
1c2f0 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
1c300 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
1c310 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
1c320 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1c330 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
1c340 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
1c350 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
1c360 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
1c370 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
1c380 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
1c390 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
1c3a0 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
1c3b0 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
1c3c0 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c3f0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
1c400 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
1c410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c420 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
1c430 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
1c440 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
1c450 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
1c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c470 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1c480 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1c490 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1c4a0 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1c4b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1c4c0 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
1c4d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
1c4e0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c500 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
1c510 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
1c520 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1c530 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
1c540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c550 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
1c560 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
1c570 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1c580 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1c590 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
1c5a0 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
1c5b0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
1c5c0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
1c5d0 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
1c5e0 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
1c5f0 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
1c600 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
1c610 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
1c620 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
1c630 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
1c640 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
1c650 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
1c660 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
1c670 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
1c680 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
1c690 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
1c6a0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1c6b0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
1c6c0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
1c6d0 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
1c6e0 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
1c6f0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
1c700 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
1c710 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
1c720 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
1c730 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
1c740 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
1c750 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
1c760 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
1c770 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
1c780 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
1c790 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
1c7a0 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
1c7b0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1c7c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
1c7d0 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
1c7e0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
1c7f0 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
1c800 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c   && pBt->readOnl
1c810 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  y) ){.    return
1c820 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1c830 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
1c840 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
1c850 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
1c860 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c870 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a  LITE_EMPTY;.  }.
1c880 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
1c890 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
1c8a0 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
1c8b0 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
1c8c0 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
1c8d0 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
1c8e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
1c8f0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
1c900 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
1c910 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
1c920 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
1c930 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
1c940 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
1c950 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
1c960 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
1c970 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
1c980 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
1c990 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20  = (u8)wrFlag;.  
1c9a0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
1c9b0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
1c9c0 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
1c9d0 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
1c9e0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
1c9f0 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
1ca00 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
1ca10 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
1ca20 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43  OR_INVALID;.  pC
1ca30 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20  ur->cachedRowid 
1ca40 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
1ca50 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
1ca60 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1ca70 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
1cab0 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
1cac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cae0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
1caf0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
1cb00 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
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 20 20 20 20 20 20 2f 2a                /*
1cb30 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
1cb40 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
1cb50 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
1cb60 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1cb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1cb80 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
1cb90 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
1cba0 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
1cbd0 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
1cbe0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
1cbf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1cc00 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
1cc10 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61  reeCursor(p, iTa
1cc20 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65  ble, wrFlag, pKe
1cc30 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20  yInfo, pCur);.  
1cc40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1cc50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1cc60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1cc70 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
1cc80 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1cc90 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
1cca0 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
1ccb0 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
1ccc0 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
1ccd0 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
1cce0 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
1ccf0 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
1cd00 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
1cd10 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
1cd20 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
1cd30 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
1cd40 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
1cd50 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
1cd60 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
1cd70 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
1cd80 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1cd90 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
1cda0 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
1cdb0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
1cdc0 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
1cdd0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
1cde0 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
1cdf0 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
1ce00 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
1ce10 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
1ce20 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
1ce30 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
1ce40 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
1ce50 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
1ce60 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
1ce70 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
1ce80 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
1ce90 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
1cea0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
1ceb0 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
1cec0 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
1ced0 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
1cee0 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
1cef0 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
1cf00 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
1cf10 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
1cf20 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
1cf30 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
1cf40 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
1cf50 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
1cf60 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
1cf70 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
1cf80 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63  *.** Set the cac
1cf90 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20  hed rowid value 
1cfa0 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  of every cursor 
1cfb0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
1cfc0 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20  base file.** as 
1cfd0 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20  pCur and having 
1cfe0 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1cff0 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75  ge number as pCu
1d000 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  r.  The value is
1d010 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69  .** set to iRowi
1d020 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f  d..**.** Only po
1d030 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c  sitive rowid val
1d040 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1d050 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69  ed valid for thi
1d060 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20  s cache..** The 
1d070 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c  cache is initial
1d080 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e  ized to zero, in
1d090 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61  dicating an inva
1d0a0 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20  lid cache..** A 
1d0b0 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20  btree will work 
1d0c0 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f  fine with zero o
1d0d0 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1d0e0 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e  s.  We just cann
1d0f0 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f  ot.** cache zero
1d100 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1d110 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ids, which means
1d120 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65   tables that use
1d130 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61   zero or.** nega
1d140 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68  tive rowids migh
1d150 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
1d160 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70  lower.  But in p
1d170 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a  ractice, zero.**
1d180 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1d190 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63  ids are very unc
1d1a0 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68  ommon so this sh
1d1b0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72  ould not be a pr
1d1c0 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
1d1d0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
1d1e0 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
1d1f0 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65  or *pCur, sqlite
1d200 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b  3_int64 iRowid){
1d210 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1d220 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42    for(p=pCur->pB
1d230 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1d240 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1d250 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1d260 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1d270 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  ) p->cachedRowid
1d280 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20   = iRowid;.  }. 
1d290 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
1d2a0 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77  achedRowid==iRow
1d2b0 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  id );.}../*.** R
1d2c0 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64  eturn the cached
1d2d0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67   rowid for the g
1d2e0 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20  iven cursor.  A 
1d2f0 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f  negative or zero
1d300 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1d310 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1d320 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1d330 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  is invalid and s
1d340 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f  hould be.** igno
1d350 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77  red.  If the row
1d360 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76  id cache has nev
1d370 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73  er before been s
1d380 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65  et, then a.** ze
1d390 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
1d3a0 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1d3b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1d3c0 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1d3d0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1d3e0 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68  eturn pCur->cach
1d3f0 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  edRowid;.}../*.*
1d400 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
1d410 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1d420 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1d430 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
1d440 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
1d450 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
1d460 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1d470 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
1d480 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
1d490 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
1d4a0 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
1d4b0 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
1d4c0 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
1d4d0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1d4e0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
1d4f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1d500 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1d510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1d520 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1d530 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1d540 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
1d550 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
1d560 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1d570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d580 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1d590 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1d5a0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1d5b0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
1d5c0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1d5d0 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
1d5e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1d5f0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
1d600 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1d610 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1d620 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1d630 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
1d640 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1d650 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
1d660 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
1d670 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
1d680 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
1d690 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1d6a0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1d6b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d6c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1d6d0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1d6e0 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
1d6f0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1d700 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
1d710 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
1d720 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
1d730 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
1d740 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
1d750 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
1d760 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
1d770 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
1d780 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
1d790 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
1d7a0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
1d7b0 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
1d7c0 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
1d7d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d7e0 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
1d7f0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a  rseCell()..**.**
1d800 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68   2007-06-25:  Th
1d810 65 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20  ere is a bug in 
1d820 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  some versions of
1d830 20 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65   MSVC that cause
1d840 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
1d850 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67   to crash when g
1d860 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20  etCellInfo() is 
1d870 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
1d880 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74   macro..** But t
1d890 68 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72  here is a measur
1d8a0 65 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61  eable speed adva
1d8b0 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74  ntage to using t
1d8c0 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a  he macro on gcc.
1d8d0 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f  ** (when less co
1d8e0 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74  mpiler optimizat
1d8f0 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72  ions like -Os or
1d900 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e   -O0 are used an
1d910 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65  d the.** compile
1d920 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61  r is not doing a
1d930 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
1d940 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
1d950 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
1d960 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
1d970 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
1d980 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
1d990 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
1d9a0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
1d9b0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
1d9c0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
1d9d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
1d9e0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1d9f0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1da00 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
1da10 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
1da20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
1da30 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
1da40 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
1da50 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
1da60 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
1da70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d  );.    assert( m
1da80 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43  emcmp(&info, &pC
1da90 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66  ur->info, sizeof
1daa0 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20  (info))==0 );.  
1dab0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
1dac0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
1dad0 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  (x).#endif.#ifde
1dae0 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20  f _MSC_VER.  /* 
1daf0 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  Use a real funct
1db00 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77  ion in MSVC to w
1db10 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20  ork around bugs 
1db20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72  in that compiler
1db30 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
1db40 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42  id getCellInfo(B
1db50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1db60 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
1db70 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
1db80 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d       int iPage =
1db90 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1dba0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
1dbb0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
1dbc0 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49  iPage],pCur->aiI
1dbd0 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d  dx[iPage],&pCur-
1dbe0 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43  >info);.      pC
1dbf0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1dc00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1dc10 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
1dc20 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  fo(pCur);.    }.
1dc30 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20    }.#else /* if 
1dc40 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a  not _MSC_VER */.
1dc50 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f    /* Use a macro
1dc60 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f   in all other co
1dc70 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20  mpilers so that 
1dc80 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
1dc90 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69  inlined */.#defi
1dca0 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  ne getCellInfo(p
1dcb0 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20 20  Cur)            
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
1dcf0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1dd00 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20  ze==0 ){        
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd30 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1dd40 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1dd50 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20 20  r->iPage;       
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1dd90 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
1dda0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1ddb0 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
1ddc0 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
1ddd0 6e 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72  nfo); \.    pCur
1dde0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
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 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65         \.  }else
1de30 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de70 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73          \.    as
1de80 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
1de90 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r);             
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
1ded0 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
1dee0 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4e 44  R */..#ifndef ND
1def0 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78  EBUG  /* The nex
1df00 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f  t routine used o
1df10 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
1df20 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1df30 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  /./*.** Return t
1df40 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65 6e  rue if the given
1df50 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c   BtCursor is val
1df60 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72  id.  A valid cur
1df70 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68  sor is one.** th
1df80 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  at is currently 
1df90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f  pointing to a ro
1dfa0 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74  w in a (non-empt
1dfb0 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69  y) table..** Thi
1dfc0 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61 74  s is a verificat
1dfd0 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75  ion routine is u
1dfe0 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
1dff0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1e000 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nts..*/.int sqli
1e010 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
1e020 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a  Valid(BtCursor *
1e030 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  pCur){.  return 
1e040 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53  pCur && pCur->eS
1e050 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1e060 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ID;.}.#endif /* 
1e070 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NDEBUG */../*.**
1e080 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
1e090 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
1e0a0 75 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20  uffer needed to 
1e0b0 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f  hold the value o
1e0c0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72  f.** the key for
1e0d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1e0e0 72 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  ry.  If the curs
1e0f0 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1e100 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64  ng.** to a valid
1e110 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69   entry, *pSize i
1e120 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a  s set to 0. .**.
1e130 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77  ** For a table w
1e140 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66  ith the INTKEY f
1e150 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f  lag set, this ro
1e160 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
1e170 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c  e key.** itself,
1e180 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20   not the number 
1e190 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
1e1a0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
1e1b0 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74  aller must posit
1e1c0 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70  ion the cursor p
1e1d0 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
1e1e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1e1f0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
1e200 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20  ne cannot fail. 
1e210 20 49 74 20 61 6c 77 61 79 73 20 72 65 74 75 72   It always retur
1e220 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a  ns SQLITE_OK.  .
1e230 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e240 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
1e250 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
1e260 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
1e270 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1e280 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1e290 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1e2a0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1e2b0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1e2c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e2d0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1e2e0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
1e2f0 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70 53 69  ALID ){.    *pSi
1e300 7a 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ze = 0;.  }else{
1e310 0a 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  .    getCellInfo
1e320 28 70 43 75 72 29 3b 0a 20 20 20 20 2a 70 53 69  (pCur);.    *pSi
1e330 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
1e340 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nKey;.  }.  retu
1e350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1e360 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1e370 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1e380 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1e390 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1e3a0 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1e3b0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1e3c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
1e3d0 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
1e3e0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
1e3f0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
1e400 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
1e410 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
1e420 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
1e430 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
1e440 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
1e450 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
1e460 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
1e470 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e480 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75  LID..**.** Failu
1e490 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
1e4a0 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  le.  This functi
1e4b0 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e  on always return
1e4c0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
1e4d0 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73  It might just as
1e4e0 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65   well be a proce
1e4f0 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20  dure (returning 
1e500 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e  void) but we con
1e510 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75  tinue.** to retu
1e520 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  rn an integer re
1e530 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69  sult code for hi
1e540 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73  storical reasons
1e550 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e560 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
1e570 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1e580 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  2 *pSize){.  ass
1e590 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1e5a0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1e5b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1e5c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e5d0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
1e5e0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
1e5f0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1e600 6f 2e 6e 44 61 74 61 3b 0a 20 20 72 65 74 75 72  o.nData;.  retur
1e610 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e620 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1e630 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
1e640 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
1e650 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1e660 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76  (parameter.** ov
1e670 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  fl), this functi
1e680 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61 67  on finds the pag
1e690 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
1e6a0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
1e6b0 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74   .** linked list
1e6c0 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   of overflow pag
1e6d0 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  es. If possible,
1e6e0 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75 74   it uses the aut
1e6f0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e  o-vacuum.** poin
1e700 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73  ter-map data ins
1e710 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20  tead of reading 
1e720 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
1e730 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73  age ovfl to do s
1e740 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  o. .**.** If an 
1e750 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20  error occurs an 
1e760 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1e770 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1e780 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20  therwise:.**.** 
1e790 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1e7a0 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
1e7b0 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1e7c0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20   linked list is 
1e7d0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
1e7e0 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
1e7f0 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c  ge ovfl is the l
1e800 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73 20  ast page in its 
1e810 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c  linked .** list,
1e820 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73   *pPgnoNext is s
1e830 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a  et to zero. .**.
1e840 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20  ** If ppPage is 
1e850 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20  not NULL, and a 
1e860 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
1e870 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
1e880 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
1e890 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1e8a0 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e  pOvfl was obtain
1e8b0 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  ed, then *ppPage
1e8c0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
1e8d0 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65   to that.** refe
1e8e0 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65  rence. It is the
1e8f0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
1e900 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
1e910 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
1e920 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67  e().** on *ppPag
1e930 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72 65  e to free the re
1e940 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72  ference. In no r
1e950 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74  eference was obt
1e960 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a  ained (because.*
1e970 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
1e980 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62  p was used to ob
1e990 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66  tain the value f
1e9a0 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20  or *pPgnoNext), 
1e9b0 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20  then.** *ppPage 
1e9c0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a  is set to zero..
1e9d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1e9e0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20  tOverflowPage(. 
1e9f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1ea00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ea10 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
1ea20 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66  le */.  Pgno ovf
1ea30 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1ea40 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1ea50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1ea60 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  mber */.  MemPag
1ea70 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
1ea80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
1ea90 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d  emPage handle (m
1eaa0 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20  ay be NULL) */. 
1eab0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74   Pgno *pPgnoNext
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ead0 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66   OUT: Next overf
1eae0 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
1eaf0 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78  */.){.  Pgno nex
1eb00 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  t = 0;.  MemPage
1eb10 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
1eb20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1eb30 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  K;..  assert( sq
1eb40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1eb50 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1eb60 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65    assert(pPgnoNe
1eb70 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  xt);..#ifndef SQ
1eb80 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1eb90 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
1eba0 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
1ebb0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1ebc0 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
1ebd0 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
1ebe0 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
1ebf0 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
1ec00 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1ec10 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
1ec20 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
1ec30 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
1ec40 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
1ec50 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
1ec60 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
1ec70 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
1ec80 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
1ec90 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
1eca0 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
1ecb0 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
1ecc0 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
1ecd0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1ece0 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1ecf0 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
1ed00 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
1ed10 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
1ed20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
1ed30 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
1ed40 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
1ed50 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ed60 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1ed70 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
1ed80 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
1ed90 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  =btreePagecount(
1eda0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  pBt) ){.      rc
1edb0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1edc0 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
1edd0 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
1ede0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1edf0 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d  K && eType==PTRM
1ee00 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20  AP_OVERFLOW2 && 
1ee10 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20  pgno==ovfl ){.  
1ee20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75        next = iGu
1ee30 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ess;.        rc 
1ee40 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1ee50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ee60 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
1ee70 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63  t( next==0 || rc
1ee80 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  ==SQLITE_DONE );
1ee90 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1eea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1eeb0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1eec0 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
1eed0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1eee0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
1eef0 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
1ef00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ef10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
1ef20 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
1ef30 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1ef40 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
1ef50 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
1ef60 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
1ef70 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
1ef80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
1ef90 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
1efa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
1efb0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1efc0 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
1efd0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
1efe0 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
1eff0 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
1f000 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
1f010 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
1f020 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
1f030 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
1f040 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
1f050 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
1f060 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
1f070 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
1f080 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
1f090 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
1f0a0 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
1f0b0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
1f0c0 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
1f0d0 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
1f0e0 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
1f0f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
1f100 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
1f110 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
1f120 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
1f130 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
1f140 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
1f150 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
1f160 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1f170 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1f180 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
1f190 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
1f1a0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
1f1b0 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
1f1c0 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
1f1d0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1f1e0 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
1f1f0 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
1f200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1f210 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
1f220 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f240 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1f250 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
1f260 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
1f270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
1f280 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
1f290 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
1f2a0 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
1f2b0 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
1f2c0 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
1f2d0 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
1f2e0 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
1f2f0 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
1f300 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
1f310 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
1f320 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1f330 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
1f340 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
1f350 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1f360 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f370 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f380 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
1f390 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
1f3a0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
1f3b0 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
1f3c0 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
1f3d0 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
1f3e0 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
1f3f0 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
1f400 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
1f410 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f420 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1f430 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f440 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
1f450 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
1f460 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
1f470 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
1f480 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
1f490 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
1f4a0 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f  ng to. If the eO
1f4b0 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  p.** parameter i
1f4c0 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20 72  s 0, this is a r
1f4d0 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64  ead operation (d
1f4e0 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a  ata copied into.
1f4f0 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
1f500 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65   If it is non-ze
1f510 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61 74  ro, a write (dat
1f520 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a  a copied from.**
1f530 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a   buffer pBuf)..*
1f540 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
1f550 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
1f560 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
1f570 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
1f580 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
1f590 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
1f5a0 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
1f5b0 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
1f5c0 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
1f5d0 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
1f5e0 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
1f5f0 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
1f600 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
1f610 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
1f620 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
1f630 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
1f640 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  r.isIncrblobHand
1f650 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  le flag is set, 
1f660 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a  and the current.
1f670 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  ** cursor entry 
1f680 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
1f690 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1f6a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1f6b0 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63  * allocates spac
1f6c0 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79  e for and lazily
1f6d0 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f   popluates the o
1f6e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1f6f0 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61  t .** cache arra
1f700 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
1f710 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65  rflow). Subseque
1f720 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
1f730 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61  s.** cache to ma
1f740 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
1f750 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
1f760 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  t more efficient
1f770 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
1f780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1f790 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
1f7a0 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
1f7b0 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
1f7c0 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
1f7d0 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
1f7e0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
1f7f0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
1f800 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
1f810 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
1f820 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
1f830 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
1f840 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
1f850 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
1f860 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
1f870 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1f880 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
1f890 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
1f8a0 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
1f8b0 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
1f8c0 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
1f8d0 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
1f8e0 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
1f8f0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
1f900 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
1f910 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
1f920 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
1f930 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1f940 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1f950 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1f960 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1f970 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
1f980 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
1f990 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
1f9a0 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
1f9b0 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
1f9c0 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
1f9d0 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
1f9e0 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
1f9f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
1fa00 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
1fa10 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
1fa20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
1fa30 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1fa40 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1fa50 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1fa60 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1fa70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1fa80 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1fa90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1faa0 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1fab0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1fac0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1fad0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1fae0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1faf0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1fb00 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1fb10 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1fb20 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1fb30 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1fb40 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1fb50 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1fb60 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1fb70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1fb80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1fb90 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1fba0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1fbb0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1fbc0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1fbd0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1fbe0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1fbf0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1fc00 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1fc10 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1fc20 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1fc30 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1fc40 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1fc50 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1fc60 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1fc70 66 28 20 4e 45 56 45 52 28 6f 66 66 73 65 74 2b  f( NEVER(offset+
1fc80 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
1fc90 3e 69 6e 66 6f 2e 6e 44 61 74 61 29 20 0a 20 20  >info.nData) .  
1fca0 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43   || &aPayload[pC
1fcb0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1fcc0 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61   > &pPage->aData
1fcd0 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  [pBt->usableSize
1fce0 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ].  ){.    /* Tr
1fcf0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
1fd00 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
1fd10 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
1fd20 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
1fd30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fd40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1fd50 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
1fd60 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
1fd70 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
1fd80 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
1fd90 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
1fda0 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
1fdb0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
1fdc0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
1fdd0 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
1fde0 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
1fdf0 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
1fe00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1fe10 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
1fe20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
1fe30 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1fe40 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1fe50 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70  a, eOp, pPage->p
1fe60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
1fe70 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
1fe80 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
1fe90 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
1fea0 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
1feb0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
1fec0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1fed0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
1fee0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
1fef0 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
1ff00 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
1ff10 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
1ff20 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
1ff30 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
1ff40 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
1ff50 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
1ff60 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
1ff70 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
1ff80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1ff90 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
1ffa0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
1ffb0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
1ffc0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
1ffd0 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
1ffe0 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
1fff0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
20000 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
20010 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
20020 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
20030 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
20040 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
20050 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
20060 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
20070 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
20080 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
20090 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
200a0 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
200b0 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
200c0 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
200d0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
200e0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
200f0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
20100 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
20110 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
20120 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
20130 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
20140 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
20150 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
20160 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
20170 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
20180 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
20190 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
201a0 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
201b0 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
201c0 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
201d0 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
201e0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
201f0 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
20200 20 20 2f 2a 20 6e 4f 76 66 6c 20 69 73 20 61 6c    /* nOvfl is al
20210 77 61 79 73 20 70 6f 73 69 74 69 76 65 2e 20 20  ways positive.  
20220 49 66 20 69 74 20 77 65 72 65 20 7a 65 72 6f 2c  If it were zero,
20230 20 66 65 74 63 68 50 61 79 6c 6f 61 64 20 77 6f   fetchPayload wo
20240 75 6c 64 20 68 61 76 65 0a 20 20 20 20 20 20 2a  uld have.      *
20250 2a 20 62 65 65 6e 20 75 73 65 64 20 69 6e 73 74  * been used inst
20260 65 61 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ead of this rout
20270 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ine. */.      if
20280 28 20 41 4c 57 41 59 53 28 6e 4f 76 66 6c 29 20  ( ALWAYS(nOvfl) 
20290 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
202a0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
202b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
202c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
202d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
202e0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
202f0 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
20300 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
20310 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
20320 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
20330 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
20340 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
20350 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
20360 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
20370 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
20380 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
20390 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
203a0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
203b0 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
203c0 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
203d0 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
203e0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
203f0 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
20400 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
20410 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
20420 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
20430 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
20440 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
20450 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
20460 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20470 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
20480 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
20490 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
204a0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
204b0 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
204c0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
204d0 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
204e0 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
204f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
20500 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
20510 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
20520 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
20530 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
20540 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
20550 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
20560 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
20570 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
20580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
20590 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
205a0 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
205b0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
205c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
205d0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
205e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
205f0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
20600 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
20610 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
20620 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
20630 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
20640 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
20650 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
20660 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
20670 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
20680 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
20690 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
206a0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
206b0 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
206c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
206d0 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
206e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
206f0 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
20700 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
20710 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
20720 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
20730 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
20740 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
20750 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
20760 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
20770 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
20780 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
20790 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
207a0 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
207b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
207c0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
207d0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
207e0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
207f0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
20800 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
20810 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
20820 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
20830 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
20840 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
20850 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  /.        DbPage
20860 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
20870 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
20880 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
20890 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
208a0 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
208b0 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
208c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
208d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
208e0 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
208f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20900 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
20910 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
20920 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
20930 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
20940 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
20950 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
20960 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f             a = o
20970 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
20980 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20990 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
209a0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
209b0 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
209c0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
209d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
209e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
209f0 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
20a00 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
20a10 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20  ;.          amt 
20a20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20  -= a;.          
20a30 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
20a40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
20a50 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
20a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
20a70 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
20a80 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
20a90 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
20aa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20ab0 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
20ac0 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
20ad0 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
20ae0 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
20af0 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
20b00 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
20b10 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
20b20 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
20b30 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
20b40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
20b50 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
20b60 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
20b70 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72  ing to a valid r
20b80 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62  ow.** in the tab
20b90 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  le..**.** Return
20ba0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
20bb0 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
20bc0 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69  r code if anythi
20bd0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
20be0 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72  .  An error is r
20bf0 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73  eturned if "offs
20c00 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65  et+amt" is large
20c10 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76  r than.** the av
20c20 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e  ailable payload.
20c30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20c40 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72  treeKey(BtCursor
20c50 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
20c60 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
20c70 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
20c80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
20c90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
20ca0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
20cb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
20cc0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
20cd0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
20ce0 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  & pCur->apPage[p
20cf0 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20  Cur->iPage] );. 
20d00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
20d10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
20d20 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
20d30 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
20d40 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  ll );.  return a
20d50 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
20d60 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
20d70 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
20d80 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  pBuf, 0);.}../*.
20d90 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
20da0 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
20db0 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
20dc0 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
20dd0 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
20de0 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
20df0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
20e00 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
20e10 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
20e20 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
20e30 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
20e40 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
20e50 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
20e60 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
20e70 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
20e80 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
20e90 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
20ea0 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
20eb0 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
20ec0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20ed0 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
20ee0 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
20ef0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
20f00 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
20f10 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
20f20 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
20f30 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
20f40 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
20f50 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
20f60 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
20f70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
20f80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
20f90 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
20fa0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
20fb0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
20fc0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
20fd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20fe0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
20ff0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
21000 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
21010 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
21020 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
21030 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
21040 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
21050 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21060 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
21070 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21080 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
21090 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
210a0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
210b0 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20  amt, pBuf, 0);. 
210c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
210d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
210e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79  a pointer to pay
210f0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
21100 20 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20   from the entry 
21110 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75  that the .** pCu
21120 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
21130 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f  ting to.  The po
21140 69 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20  inter is to the 
21150 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20  beginning of.** 
21160 74 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b  the key if skipK
21170 65 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69  ey==0 and it poi
21180 6e 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e  nts to the begin
21190 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a  ning of data if.
211a0 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20  ** skipKey==1.  
211b0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  The number of by
211c0 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
211d0 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
211e0 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41  tten.** into *pA
211f0 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30  mt.  If *pAmt==0
21200 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
21210 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
21220 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64  ot be.** a valid
21230 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
21240 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
21250 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
21260 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66    It is common f
21270 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  or the entire ke
21280 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f  y.** and data to
21290 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61   fit on the loca
212a0 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74  l page and for t
212b0 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76  here to be no ov
212c0 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e  erflow.** pages.
212d0 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73    When that is s
212e0 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  o, this routine 
212f0 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
21300 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79  ccess the.** key
21310 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75   and data withou
21320 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e  t making a copy.
21330 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64    If the key and
21340 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a  /or data spills.
21350 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ** onto overflow
21360 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63   pages, then acc
21370 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73  essPayload() mus
21380 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61  t be used to rea
21390 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b  ssemble.** the k
213a0 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79  ey/data and copy
213b0 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c   it into a preal
213c0 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a  located buffer..
213d0 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
213e0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  r returned by th
213f0 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73  is routine looks
21400 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74   directly into t
21410 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67  he cached.** pag
21420 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21430 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67  e.  The data mig
21440 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76  ht change or mov
21450 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a  e the next time.
21460 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75  ** any btree rou
21470 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
21480 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
21490 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66  unsigned char *f
214a0 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
214b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
214c0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
214d0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
214e0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
214f0 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20    int *pAmt,    
21500 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
21510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
21520 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
21530 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70  re */.  int skip
21540 4b 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Key          /* 
21550 72 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61  read beginning a
21560 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
21570 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75  s true */.){.  u
21580 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
21590 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67  ayload;.  MemPag
215a0 65 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20  e *pPage;.  u32 
215b0 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e 4c 6f 63  nKey;.  u32 nLoc
215c0 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  al;..  assert( p
215d0 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
215e0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
215f0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21600 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
21610 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
21620 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
21630 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
21640 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
21650 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
21660 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21670 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
21680 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
21690 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
216a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  e->nCell );.  if
216b0 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 69 6e  ( NEVER(pCur->in
216c0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 29 20 29 7b 0a  fo.nSize==0) ){.
216d0 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
216e0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
216f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 20 70 43  pCur->iPage], pC
21700 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
21710 69 50 61 67 65 5d 2c 0a 20 20 20 20 20 20 20 20  iPage],.        
21720 20 20 20 20 20 20 20 20 20 20 20 26 70 43 75 72             &pCur
21730 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 61  ->info);.  }.  a
21740 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
21750 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
21760 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
21770 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
21780 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
21790 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
217a0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
217b0 6e 4b 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72  nKey = (int)pCur
217c0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d  ->info.nKey;.  }
217d0 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29  .  if( skipKey )
217e0 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b  {.    aPayload +
217f0 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63  = nKey;.    nLoc
21800 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
21810 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20  nLocal - nKey;. 
21820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63   }else{.    nLoc
21830 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  al = pCur->info.
21840 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 61 73 73 65  nLocal;.    asse
21850 72 74 28 20 6e 4c 6f 63 61 6c 3c 3d 6e 4b 65 79  rt( nLocal<=nKey
21860 20 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20   );.  }.  *pAmt 
21870 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75  = nLocal;.  retu
21880 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  rn aPayload;.}..
21890 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
218a0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
218b0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
218c0 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
218d0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
218e0 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
218f0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
21900 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
21910 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
21920 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
21930 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
21940 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
21950 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
21960 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
21970 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
21980 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
21990 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
219a0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
219b0 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
219c0 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
219d0 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
219e0 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
219f0 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
21a00 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
21a10 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
21a20 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
21a30 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
21a40 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
21a50 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
21a60 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
21a70 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
21a80 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
21a90 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
21aa0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
21ab0 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
21ac0 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
21ad0 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
21ae0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
21af0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
21b00 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
21b10 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
21b20 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
21b30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21b40 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
21b50 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
21b60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21b70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21b80 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
21b90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21ba0 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20  RSOR_VALID) ){. 
21bb0 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f     p = (const vo
21bc0 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
21bd0 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
21be0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
21bf0 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
21c00 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
21c10 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
21c20 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
21c30 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
21c40 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
21c50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21c60 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
21c70 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
21c80 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21c90 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21ca0 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
21cb0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21cc0 52 53 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20  RSOR_VALID) ){. 
21cd0 20 20 20 70 20 3d 20 28 63 6f 6e 73 74 20 76 6f     p = (const vo
21ce0 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
21cf0 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b  (pCur, pAmt, 1);
21d00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
21d10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
21d20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
21d30 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
21d40 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
21d50 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
21d60 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
21d70 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
21d80 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
21d90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21da0 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
21db0 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
21dc0 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
21dd0 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
21de0 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
21df0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
21e00 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
21e10 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
21e20 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
21e30 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
21e40 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
21e50 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
21e60 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
21e70 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
21e80 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
21e90 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
21ea0 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
21eb0 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
21ec0 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50  int i = pCur->iP
21ed0 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age;.  MemPage *
21ee0 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68  pNewPage;.  BtSh
21ef0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
21f00 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
21f10 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21f20 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21f30 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21f40 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21f50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21f60 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
21f70 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
21f80 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
21f90 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
21fa0 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
21fb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21fc0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
21fd0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
21fe0 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50  itPage(pBt, newP
21ff0 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b  gno, &pNewPage);
22000 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
22010 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61  rn rc;.  pCur->a
22020 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65  pPage[i+1] = pNe
22030 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61  wPage;.  pCur->a
22040 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20  iIdx[i+1] = 0;. 
22050 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a   pCur->iPage++;.
22060 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
22070 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
22080 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
22090 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e    if( pNewPage->
220a0 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70 4e 65 77 50  nCell<1 || pNewP
220b0 61 67 65 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75  age->intKey!=pCu
220c0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 69 6e  r->apPage[i]->in
220d0 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
220e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
220f0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
22100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22110 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
22120 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
22130 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
22140 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
22150 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
22160 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
22170 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
22180 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
22190 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
221a0 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
221b0 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
221c0 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
221d0 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
221e0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
221f0 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
22200 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
22210 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
22220 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
22230 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
22240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22250 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
22260 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
22270 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
22280 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61  gno iChild){.  a
22290 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61  ssert( iIdx<=pPa
222a0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  rent->nCell );. 
222b0 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65   if( iIdx==pPare
222c0 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
222d0 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
222e0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
222f0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
22300 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64  fset+8])==iChild
22310 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
22320 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74   assert( get4byt
22330 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65  e(findCell(pPare
22340 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69  nt, iIdx))==iChi
22350 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  ld );.  }.}.#els
22360 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65  e.#  define asse
22370 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c  rtParentIndex(x,
22380 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a  y,z) .#endif../*
22390 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
223a0 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61  sor up to the pa
223b0 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  rent page..**.**
223c0 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
223d0 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e  t to the cell in
223e0 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  dex that contain
223f0 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  s the pointer.**
22400 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20   to the page we 
22410 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e  are coming from.
22420 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69    If we are comi
22430 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72  ng from the.** r
22440 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20  ight-most child 
22450 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e  page then pCur->
22460 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e  idx is set to on
22470 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74  e more than.** t
22480 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20  he largest cell 
22490 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
224a0 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65   void moveToPare
224b0 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
224c0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
224d0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
224e0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
224f0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
22500 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
22510 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22520 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
22530 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
22540 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
22550 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
22560 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72 2d  Index(.    pCur-
22570 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
22580 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75  age-1], .    pCu
22590 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
225a0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
225b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
225c0 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20  >iPage]->pgno.  
225d0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
225e0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
225f0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 70  ur->iPage]);.  p
22600 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
22610 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
22620 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
22630 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 7d 0a 0a  lidNKey = 0;.}..
22640 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
22650 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
22660 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
22670 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
22680 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
22690 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
226a0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
226b0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
226c0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
226d0 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
226e0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
226f0 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
22700 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
22710 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
22720 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
22730 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
22740 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
22750 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
22760 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
22770 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
22780 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
22790 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
227a0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
227b0 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
227c0 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
227d0 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
227e0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
227f0 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
22800 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
22810 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
22820 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
22830 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
22840 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
22850 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
22860 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
22870 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
22880 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
22890 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
228a0 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
228b0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
228c0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
228d0 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
228e0 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
228f0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
22900 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
22910 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
22920 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
22930 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
22940 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
22950 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
22960 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
22970 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
22980 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
22990 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
229a0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
229b0 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
229c0 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
229d0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
229e0 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
229f0 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
22a00 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
22a10 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
22a20 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
22a30 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
22a40 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
22a50 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
22a60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22a70 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
22a80 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
22a90 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
22aa0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22ab0 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  OK;.  Btree *p =
22ac0 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
22ad0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22ae0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65   p->pBt;..  asse
22af0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
22b00 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
22b10 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49  assert( CURSOR_I
22b20 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f  NVALID < CURSOR_
22b30 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
22b40 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
22b50 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52  VALID   < CURSOR
22b60 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
22b70 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
22b80 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f  _FAULT   > CURSO
22b90 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
22ba0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
22bb0 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
22bc0 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69  IRESEEK ){.    i
22bd0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
22be0 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
22bf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22c00 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53  Cur->skipNext!=S
22c10 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
22c20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
22c30 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  kipNext;.    }. 
22c40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
22c50 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
22c60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
22c70 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
22c80 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
22c90 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=1; i<=pCur->
22ca0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
22cb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
22cc0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
22cd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
22ce0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65  >iPage = 0;.  }e
22cf0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65  lse{.    rc = ge
22d00 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
22d10 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
22d20 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
22d30 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  0]);.    if( rc!
22d40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22d50 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
22d60 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
22d70 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
22d80 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rc;.    }.    pC
22d90 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a  ur->iPage = 0;..
22da0 20 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e      /* If pCur->
22db0 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20  pKeyInfo is not 
22dc0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63  NULL, then the c
22dd0 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65  aller that opene
22de0 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20  d this cursor.  
22df0 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
22e00 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
22e10 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
22e20 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
22e30 6e 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55  nfo is.    ** NU
22e40 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
22e50 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
22e60 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
22e70 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
22e80 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e      ** return an
22e90 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
22ea0 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61  error.  */.    a
22eb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
22ec0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
22ed0 31 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  1 || pCur->apPag
22ee0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  e[0]->intKey==0 
22ef0 29 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75 72  );.    if( (pCur
22f00 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d  ->pKeyInfo==0)!=
22f10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
22f20 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
22f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22f40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
22f50 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73   }.  }..  /* Ass
22f60 65 72 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f  ert that the roo
22f70 74 20 70 61 67 65 20 69 73 20 6f 66 20 74 68 65  t page is of the
22f80 20 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54   correct type. T
22f90 68 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a  his must be the.
22fa0 20 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65    ** case as the
22fb0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75   call to this fu
22fc0 6e 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64  nction that load
22fd0 65 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ed the root-page
22fe0 20 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68   (either.  ** th
22ff0 69 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65  is call or a pre
23000 76 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e  vious invocation
23010 29 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  ) would have det
23020 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
23030 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73   .  ** if the as
23040 73 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f  sumption were no
23050 74 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69  t true, and it i
23060 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66  s not possible f
23070 6f 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20  or the flags .  
23080 2a 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65 20  ** byte to have 
23090 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68  been modified wh
230a0 69 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ile this cursor 
230b0 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66  is holding a ref
230c0 65 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74  erence.  ** to t
230d0 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70  he page.  */.  p
230e0 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
230f0 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
23100 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
23110 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
23120 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
23130 2d 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43 75  ->isInit && (pCu
23140 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d  r->pKeyInfo==0)=
23150 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29  =pRoot->intKey )
23160 3b 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  ;..  pCur->aiIdx
23170 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  [0] = 0;.  pCur-
23180 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23190 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
231a0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
231b0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69  idNKey = 0;..  i
231c0 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d  f( pRoot->nCell=
231d0 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65  =0 && !pRoot->le
231e0 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
231f0 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
23200 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
23210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23220 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
23230 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
23240 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
23250 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
23260 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
23270 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
23280 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
23290 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
232a0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
232b0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
232c0 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f  >eState = ((pRoo
232d0 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53  t->nCell>0)?CURS
232e0 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f  OR_VALID:CURSOR_
232f0 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20  INVALID);.  }.  
23300 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23310 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
23320 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
23330 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
23340 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
23350 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
23360 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
23370 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
23380 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
23390 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
233a0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
233b0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
233c0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
233d0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
233e0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
233f0 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
23400 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
23410 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
23420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
23430 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
23440 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23450 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23470 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23480 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
23490 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
234a0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
234b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
234c0 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
234d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
234e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
234f0 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
23500 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
23510 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
23520 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
23530 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23540 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ge]));.    rc = 
23550 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
23560 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
23570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23580 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
23590 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
235a0 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
235b0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
235c0 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
235d0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
235e0 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
235f0 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
23600 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
23610 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
23620 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
23630 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
23640 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
23650 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
23660 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
23670 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
23680 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
23690 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
236a0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
236b0 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
236c0 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
236d0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
236e0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
236f0 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
23700 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
23710 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
23720 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
23730 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
23740 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
23750 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
23760 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23770 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
23780 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
23790 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
237a0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
237b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
237c0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
237d0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
237e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
237f0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
23800 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
23810 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20  ->iPage])->leaf 
23820 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
23830 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
23840 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
23850 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
23860 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
23870 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
23880 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d  >nCell;.    rc =
23890 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
238a0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
238b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
238c0 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  K ){.    pCur->a
238d0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
238e0 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ] = pPage->nCell
238f0 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  -1;.    pCur->in
23900 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
23910 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
23920 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  y = 0;.  }.  ret
23930 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
23940 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
23950 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
23960 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
23970 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23980 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
23990 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
239a0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
239b0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
239c0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
239d0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
239e0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
239f0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
23a00 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
23a10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23a20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
23a30 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
23a40 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
23a50 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
23a60 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
23a70 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
23a80 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
23a90 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
23aa0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
23ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23ac0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
23ad0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23ae0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
23af0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23b00 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
23b10 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
23b20 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
23b30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23b40 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
23b50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23b60 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
23b70 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
23b80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
23b90 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
23ba0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
23bb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
23bc0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
23bd0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
23be0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
23bf0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
23c00 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
23c10 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
23c20 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
23c30 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
23c40 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
23c50 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
23c60 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
23c70 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
23c80 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
23c90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
23ca0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
23cb0 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
23cc0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23cd0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23ce0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
23cf0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
23d00 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
23d10 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
23d20 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
23d30 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
23d40 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
23d50 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
23d60 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
23d70 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
23d80 26 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  && pCur->atLast 
23d90 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
23da0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
23db0 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
23dc0 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
23dd0 20 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c   the cursor real
23de0 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20  ly does point . 
23df0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73     ** to the las
23e00 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62  t entry in the b
23e10 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  -tree. */.    in
23e20 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69  t ii;.    for(ii
23e30 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61  =0; ii<pCur->iPa
23e40 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
23e50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
23e60 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e  iIdx[ii]==pCur->
23e70 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c  apPage[ii]->nCel
23e80 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  l );.    }.    a
23e90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
23ea0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
23eb0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  =pCur->apPage[pC
23ec0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
23ed0 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
23ee0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
23ef0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
23f00 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
23f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23f20 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
23f30 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
23f40 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23f50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
23f60 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
23f70 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
23f80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
23f90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
23fa0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
23fb0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
23fc0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
23fd0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
23fe0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23ff0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
24000 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
24010 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
24020 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
24030 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
24040 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
24050 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
24060 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24070 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
24080 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
24090 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
240a0 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
240b0 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
240c0 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
240d0 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
240e0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
240f0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
24100 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
24110 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
24120 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
24130 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
24140 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
24150 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
24160 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
24170 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
24180 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
24190 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
241a0 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
241b0 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
241c0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
241d0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
241e0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
241f0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
24200 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
24210 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
24220 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
24230 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
24240 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
24250 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
24260 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
24270 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
24280 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
24290 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
242a0 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
242b0 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
242c0 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
242d0 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
242e0 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
242f0 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
24300 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
24310 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
24320 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
24330 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
24340 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
24350 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
24360 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
24370 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
24380 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
24390 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
243a0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
243b0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
243c0 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
243d0 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
243e0 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
243f0 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
24400 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
24410 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
24420 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
24430 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
24460 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
24470 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
24480 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
24490 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
244a0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
244b0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
244c0 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
244d0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
244e0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
244f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
24500 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
24510 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
24520 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24530 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
24540 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
24550 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
24560 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
24570 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
24580 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
24590 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
245a0 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
245b0 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
245c0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
245d0 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
245e0 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
245f0 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
24600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24610 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
24620 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
24630 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
24640 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
24650 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24660 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24670 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
24680 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
24690 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
246a0 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73 73  t( pRes );.  ass
246b0 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d 30  ert( (pIdxKey==0
246c0 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  )==(pCur->pKeyIn
246d0 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  fo==0) );..  /* 
246e0 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
246f0 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f   already positio
24700 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74  ned at the point
24710 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20   we are trying. 
24720 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20   ** to move to, 
24730 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
24740 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
24750 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28  ny work */.  if(
24760 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24770 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70  URSOR_VALID && p
24780 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a  Cur->validNKey .
24790 20 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61     && pCur->apPa
247a0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20  ge[0]->intKey . 
247b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
247c0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
247d0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
247e0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
247f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24800 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
24810 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43  ur->atLast && pC
24820 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
24830 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70  tKey ){.      *p
24840 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
24850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24860 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
24870 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
24880 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
24890 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
248a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
248b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
248c0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
248d0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
248e0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
248f0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
24900 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
24910 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
24920 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 43 75 72 2d  nCell>0 || pCur-
24930 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
24940 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  INVALID );.  if(
24950 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
24960 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
24970 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b  .    *pRes = -1;
24980 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
24990 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
249a0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
249b0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
249c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
249d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
249e0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
249f0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
24a00 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
24a10 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 3b 0a   lwr, upr, idx;.
24a20 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
24a30 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
24a40 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
24a50 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
24a60 0a 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20  .    int c;..   
24a70 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   /* pPage->nCell
24a80 20 6d 75 73 74 20 62 65 20 67 72 65 61 74 65 72   must be greater
24a90 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74   than zero. If t
24aa0 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d  his is the root-
24ab0 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  page.    ** the 
24ac0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76  cursor would hav
24ad0 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61  e been INVALID a
24ae0 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f  bove and this fo
24af0 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a  r(;;) loop.    *
24b00 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68  * not run. If th
24b10 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f  is is not the ro
24b20 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot-page, then th
24b30 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  e moveToChild() 
24b40 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77  routine.    ** w
24b50 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
24b60 79 20 64 65 74 65 63 74 65 64 20 64 62 20 63 6f  y detected db co
24b70 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61  rruption. Simila
24b80 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a  rly, pPage must.
24b90 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69      ** be the ri
24ba0 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20  ght kind (index 
24bb0 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74  or table) of b-t
24bc0 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77  ree page. Otherw
24bd0 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76  ise.    ** a mov
24be0 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f  eToChild() or mo
24bf0 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20  veToRoot() call 
24c00 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65 63  would have detec
24c10 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ted corruption. 
24c20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
24c30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
24c40 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
24c50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49  age->intKey==(pI
24c60 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20  dxKey==0) );.   
24c70 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70   lwr = 0;.    up
24c80 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  r = pPage->nCell
24c90 2d 31 3b 0a 20 20 20 20 69 66 28 20 62 69 61 73  -1;.    if( bias
24ca0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
24cb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
24cc0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
24cd0 69 64 78 20 3d 20 75 70 72 29 3b 0a 20 20 20 20  idx = upr);.    
24ce0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
24cf0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
24d00 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 69 64  Page] = (u16)(id
24d10 78 20 3d 20 28 75 70 72 2b 6c 77 72 29 2f 32 29  x = (upr+lwr)/2)
24d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
24d30 3b 3b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ;;){.      u8 *p
24d40 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
24d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24d60 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72  * Pointer to cur
24d70 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
24d80 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ge */..      ass
24d90 65 72 74 28 20 69 64 78 3d 3d 70 43 75 72 2d 3e  ert( idx==pCur->
24da0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
24db0 65 5d 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  e] );.      pCur
24dc0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
24dd0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
24de0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
24df0 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68  idx) + pPage->ch
24e00 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
24e10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
24e20 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
24e30 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
24e40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
24e50 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
24e60 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
24e70 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
24e80 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
24e90 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  Cell, dummy);.  
24ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24eb0 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
24ec0 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
24ed0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
24ee0 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
24ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
24f00 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
24f10 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69  e if( nCellKey<i
24f20 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
24f30 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20     c = -1;.     
24f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24f50 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
24f60 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  lKey>intKey );. 
24f70 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
24f80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24f90 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
24fa0 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ey = 1;.        
24fb0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
24fc0 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
24fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24fe0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
24ff0 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
25000 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
25010 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
25020 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
25030 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
25040 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
25050 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
25060 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
25070 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
25080 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
25090 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
250a0 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
250b0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
250c0 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
250d0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
250e0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
250f0 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
25100 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
25110 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
25120 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
25130 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
25140 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
25150 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
25160 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
25170 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
25180 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
25190 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
251a0 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
251b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
251c0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20      int nCell = 
251d0 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
251e0 20 20 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20    if( !(nCell & 
251f0 30 78 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d  0x80) && nCell<=
25200 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
25210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
25220 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
25230 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
25240 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
25250 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
25260 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
25270 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
25280 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
25290 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
252a0 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
252b0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
252c0 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  /.          c = 
252d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
252e0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
252f0 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d  (void*)&pCell[1]
25300 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
25310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
25320 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29  pCell[1] & 0x80)
25330 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
25340 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26  nCell = ((nCell&
25350 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c  0x7f)<<7) + pCel
25360 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61  l[1])<=pPage->ma
25370 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29  xLocal.        )
25380 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
25390 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
253a0 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
253b0 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
253c0 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
253d0 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
253e0 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
253f0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
25400 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
25410 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
25420 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
25430 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
25440 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
25450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25460 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
25470 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
25480 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
25490 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
254a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
254b0 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
254c0 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
254d0 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
254e0 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
254f0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
25500 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
25510 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
25520 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
25530 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
25540 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
25550 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
25560 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
25570 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
25580 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
25590 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
255a0 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
255b0 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
255c0 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
255d0 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
255e0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
255f0 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
25600 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
25610 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
25620 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
25630 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
25640 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
25650 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  oc( nCell );.   
25660 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
25670 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
25680 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25690 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
256a0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
256b0 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
256c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
256d0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
256e0 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
256f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
25700 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a  *)pCellKey, 0);.
25710 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
25720 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25730 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
25740 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
25750 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
25760 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
25770 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
25780 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
25790 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
257a0 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
257b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
257c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
257d0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
257e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
257f0 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
25800 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
25810 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
25820 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
25830 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
25840 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77          upr = lw
25850 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r - 1;.         
25860 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
25870 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
25880 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
25890 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
258a0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
258b0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
258c0 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
258d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
258e0 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
258f0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
25900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25910 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
25920 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
25930 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20  lwr>upr ){.     
25940 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
25950 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  }.      pCur->ai
25960 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25970 20 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20 28   = (u16)(idx = (
25980 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20  lwr+upr)/2);.   
25990 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
259a0 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20  wr==upr+1 );.   
259b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
259c0 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
259d0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
259e0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
259f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
25a00 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
25a10 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
25a20 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
25a30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
25a40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
25a50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25a60 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
25a70 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
25a80 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
25a90 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67  }.    if( chldPg
25aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
25ab0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
25ac0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
25ad0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
25ae0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
25af0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
25b00 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
25b10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
25b20 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
25b30 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
25b40 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
25b50 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
25b60 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
25b70 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
25b80 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
25b90 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
25ba0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
25bb0 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
25bc0 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
25bd0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
25be0 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
25bf0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
25c00 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
25c10 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
25c20 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
25c30 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
25c40 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
25c50 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
25c60 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
25c70 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
25c80 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
25c90 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
25ca0 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
25cb0 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
25cc0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
25cd0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
25ce0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
25cf0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
25d00 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
25d10 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
25d20 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
25d30 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
25d40 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
25d50 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
25d60 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
25d70 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
25d80 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
25d90 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
25da0 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
25db0 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
25dc0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
25dd0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
25de0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
25df0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
25e00 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
25e10 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
25e20 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
25e30 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
25e40 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
25e50 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
25e60 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
25e70 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
25e80 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
25e90 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
25ea0 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
25eb0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
25ec0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
25ed0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
25ee0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
25ef0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
25f00 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
25f10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
25f20 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
25f30 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
25f40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
25f50 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
25f60 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
25f70 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
25f80 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
25f90 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
25fa0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
25fb0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
25fc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
25fd0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
25fe0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
25ff0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
26000 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
26010 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
26020 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
26030 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
26040 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
26050 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ext>0 ){.    pCu
26060 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
26070 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
26080 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26090 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
260a0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
260b0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
260c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
260d0 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b  age];.  idx = ++
260e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
260f0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
26100 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
26110 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  t );.  assert( i
26120 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx<=pPage->nCell
26130 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66   );..  pCur->inf
26140 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
26150 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
26160 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70   0;.  if( idx>=p
26170 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
26180 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
26190 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
261a0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
261b0 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
261c0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
261d0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
261e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
261f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
26200 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
26210 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
26220 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
26230 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26240 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20     }.    do{.   
26250 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
26260 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
26270 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
26280 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
26290 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
262a0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
262b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
262c0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
262d0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
262e0 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
262f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26300 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
26310 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
26320 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
26330 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
26340 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
26350 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
26360 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
26370 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
26380 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
26390 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
263a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
263b0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
263c0 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
263d0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
263e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
263f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26400 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
26410 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
26420 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26430 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
26440 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
26450 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
26460 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
26470 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
26480 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
26490 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
264a0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
264b0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
264c0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
264d0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
264e0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
264f0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
26500 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
26510 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
26520 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
26530 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
26540 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
26550 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
26560 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
26570 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
26580 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26590 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
265a0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
265b0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
265c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
265d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
265e0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74  ;.  }.  pCur->at
265f0 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Last = 0;.  if( 
26600 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
26610 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
26620 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
26630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26640 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
26650 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
26660 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
26670 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a  pNext = 0;.    *
26680 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
26690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
266a0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
266b0 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61  Next = 0;..  pPa
266c0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
266d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
266e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
266f0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
26700 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
26710 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
26720 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26730 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
26740 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
26750 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
26760 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
26770 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
26780 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
26790 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
267a0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
267b0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73  st(pCur);.  }els
267c0 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  e{.    while( pC
267d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
267e0 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20  iPage]==0 ){.   
267f0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61     if( pCur->iPa
26800 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ge==0 ){.       
26810 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
26820 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
26830 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
26840 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  1;.        retur
26850 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
26860 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
26870 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
26880 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
26890 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
268a0 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
268b0 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75  ey = 0;..    pCu
268c0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
268d0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
268e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
268f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
26900 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
26910 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
26920 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
26930 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
26940 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
26950 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
26960 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
26970 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
26980 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
26990 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
269a0 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
269b0 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
269c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
269d0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
269e0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
269f0 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
26a00 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
26a10 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
26a20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
26a30 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
26a40 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
26a50 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
26a60 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
26a70 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
26a80 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
26a90 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
26aa0 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
26ab0 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
26ac0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
26ad0 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
26ae0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
26af0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
26b00 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
26b10 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
26b20 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
26b30 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
26b40 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
26b50 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
26b60 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
26b70 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
26b80 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
26b90 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
26ba0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
26bb0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
26bc0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
26bd0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
26be0 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65  t 0, then a (fee
26bf0 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d  ble) effort is m
26c00 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
26c10 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
26c20 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
26c30 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
26c40 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
26c50 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
26c60 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
26c70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
26c80 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
26c90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
26ca0 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
26cb0 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
26cc0 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
26cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65  .**.** If the "e
26ce0 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20  xact" parameter 
26cf0 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68  is not 0, and th
26d00 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65  e page-number ne
26d10 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20  arby exists .** 
26d20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
26d30 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
26d40 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  it is guarenteed
26d50 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
26d60 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
26d70 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
26d80 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77  cuum databases w
26d90 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  hen allocating a
26da0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   new table..*/.s
26db0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
26dc0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
26dd0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
26de0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
26df0 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e  e, .  Pgno *pPgn
26e00 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62  o, .  Pgno nearb
26e10 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b  y,.  u8 exact.){
26e20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
26e30 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
26e40 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
26e50 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
26e60 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
26e70 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
26e80 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
26e90 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
26ea0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
26eb0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
26ec0 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
26ed0 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
26ee0 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
26ef0 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
26f00 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
26f10 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
26f20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26f30 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
26f40 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
26f50 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
26f60 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
26f70 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
26f80 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
26f90 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
26fa0 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
26fb0 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
26fc0 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
26fd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
26fe0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26ff0 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
27000 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
27010 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
27020 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
27030 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
27040 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
27050 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
27060 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
27070 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
27080 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
27090 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
270a0 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
270b0 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63   /* If the 'exac
270c0 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73  t' parameter was
270d0 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72   true and a quer
270e0 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
270f0 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
27100 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
27110 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
27120 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
27130 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
27140 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
27150 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
27160 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
27170 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
27180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
27190 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
271a0 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62  ( exact && nearb
271b0 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
271c0 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
271d0 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
271e0 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  y>0 );.      ass
271f0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
27200 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63  cuum );.      rc
27210 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
27220 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
27230 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
27240 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
27250 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
27260 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
27270 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72   ){.        sear
27280 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
27290 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f    }.      *pPgno
272a0 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d   = nearby;.    }
272b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
272c0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Decrement the fr
272d0 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79  ee-list count by
272e0 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74   1. Set iTrunk t
272f0 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
27300 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
27310 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
27320 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b  page. iPrevTrunk
27330 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e   is initially 1.
27340 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
27350 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
27360 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
27370 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
27380 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
27390 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
273a0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d  1->aData[36], n-
273b0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  1);..    /* The 
273c0 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73  code within this
273d0 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c   loop is run onl
273e0 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73  y once if the 's
273f0 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61  earchList' varia
27400 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  ble.    ** is no
27410 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73  t true. Otherwis
27420 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20  e, it runs once 
27430 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70  for each trunk-p
27440 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  age on the.    *
27450 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69  * free-list unti
27460 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72  l the page 'near
27470 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a  by' is located..
27480 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
27490 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
274a0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
274b0 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
274c0 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  ){.        iTrun
274d0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
274e0 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
274f0 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  0]);.      }else
27500 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
27510 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
27520 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
27530 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
27540 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
27550 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
27560 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
27570 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ge ){.        rc
27580 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
27590 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
275a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
275b0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
275c0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
275d0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
275e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
275f0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
27600 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
27610 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
27620 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
27630 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
27640 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
27650 34 5d 29 3b 20 2f 2a 20 23 20 6f 66 20 6c 65 61  4]); /* # of lea
27660 76 65 73 20 6f 6e 20 74 68 69 73 20 74 72 75 6e  ves on this trun
27670 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  k page */.      
27680 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61  if( k==0 && !sea
27690 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  rchList ){.     
276a0 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
276b0 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e  has no leaves an
276c0 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f  d the list is no
276d0 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  t being searched
276e0 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  . .        ** So
276f0 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75   extract the tru
27700 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61  nk page itself a
27710 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65  nd use it as the
27720 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20   newly .        
27730 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  ** allocated pag
27740 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  e */.        ass
27750 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d  ert( pPrevTrunk=
27760 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
27770 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
27780 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
27790 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
277a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
277b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
277c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
277d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50     }.        *pP
277e0 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20  gno = iTrunk;.  
277f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
27800 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
27810 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
27820 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
27830 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
27840 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  ;.        pTrunk
27850 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
27860 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
27870 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
27880 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
27890 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
278a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
278b0 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73   k>(u32)(pBt->us
278c0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20  ableSize/4 - 2) 
278d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61  ){.        /* Va
278e0 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20  lue of k is out 
278f0 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62  of range.  Datab
27900 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a  ase corruption *
27910 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
27920 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27930 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
27940 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
27950 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
27960 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27970 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
27980 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26  f( searchList &&
27990 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20   nearby==iTrunk 
279a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
279b0 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
279c0 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
279d0 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
279e0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
279f0 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
27a00 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
27a10 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
27a20 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
27a30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27a40 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20   *pPgno==iTrunk 
27a50 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
27a60 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
27a70 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
27a80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
27a90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
27aa0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
27ab0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
27ac0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
27ad0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
27ae0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
27af0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
27b00 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
27b10 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
27b20 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
27b30 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
27b40 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
27b50 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
27b60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
27b70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
27b80 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27b90 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
27ba0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
27bb0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
27bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
27be0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
27bf0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
27c00 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
27c10 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
27c20 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
27c30 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
27c40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
27c50 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
27c60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
27c70 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
27c80 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
27c90 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
27ca0 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
27cb0 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
27cc0 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
27cd0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
27ce0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
27cf0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
27d00 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
27d10 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
27d20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
27d30 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
27d40 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
27d50 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
27d60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
27d70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27d80 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
27d90 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
27da0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
27db0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
27dc0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
27dd0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
27de0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27df0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
27e00 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
27e10 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
27e20 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
27e30 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
27e40 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
27e50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
27e60 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27e70 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
27e80 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
27e90 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
27ea0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
27eb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
27ec0 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
27ed0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
27ee0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
27f00 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
27f10 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
27f20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
27f30 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
27f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27f50 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
27f60 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
27f70 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
27f80 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
27f90 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
27fa0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
27fb0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
27fc0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
27fd0 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
27fe0 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
27ff0 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
28000 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28010 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
28020 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
28030 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
28040 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
28050 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
28060 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
28070 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
28080 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
28090 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
280a0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
280b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
280c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
280d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
280e0 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
280f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28100 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
28110 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
28120 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
28130 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
28140 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
28150 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
28160 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
28170 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
28180 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28190 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
281a0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
281b0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
281c0 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
281d0 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
281e0 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
281f0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
28200 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
28210 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
28220 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
28230 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
28240 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
28250 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
28260 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
28270 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
28280 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
28290 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
282a0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
282b0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
282c0 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
282d0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
282e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
282f0 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  st = sqlite3AbsI
28300 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
28310 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
28320 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  y);.          fo
28330 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
28340 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
28350 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
28360 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
28370 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
28380 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
28390 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
283a0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
283b0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
283d0 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
283e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
283f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
28400 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
28410 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
28420 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
28430 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
28440 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
28450 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
28460 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
28470 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
28480 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
28490 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
284a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
284b0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
284c0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
284d0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
284e0 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
284f0 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
28500 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
28510 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20   !searchList || 
28520 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b  iPage==nearby ){
28530 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
28540 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20  oContent;.      
28550 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
28560 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  ge;.          TR
28570 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
28580 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
28590 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
285a0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
285b0 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
285c0 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
285e0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
285f0 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
28600 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
28610 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
28620 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
28630 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28640 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
28650 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
28660 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
28670 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
28680 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
28690 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
286a0 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
286b0 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
286c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
286d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
286e0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
286f0 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
28700 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
28710 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
28720 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
28730 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
28740 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
28750 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
28760 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
28770 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
28790 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
287a0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
287b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
287c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
287d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
287e0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
287f0 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
28800 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28810 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28820 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
28830 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
28840 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
28850 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
28860 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
28870 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
28880 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
28890 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
288a0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
288b0 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
288c0 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
288d0 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
288e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
288f0 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
28900 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
28910 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
28920 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
28930 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
28940 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
28950 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
28960 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
28970 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
28980 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
28990 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
289a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
289b0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
289c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
289d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
289e0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
289f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
28a00 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
28a10 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
28a20 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
28a30 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
28a40 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
28a50 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
28a60 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
28a70 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
28a80 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
28a90 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
28aa0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
28ab0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
28ac0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
28ad0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
28ae0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
28af0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
28b00 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
28b10 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
28b20 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
28b30 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
28b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
28b50 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
28b60 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
28b70 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
28b80 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
28b90 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70  , pBt->nPage, &p
28ba0 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 1);.      if
28bb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28bc0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28bd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28be0 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
28bf0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
28c00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
28c10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
28c20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28c30 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
28c40 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
28c50 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42  nPage==PENDING_B
28c60 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
28c70 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d   pBt->nPage++; }
28c80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
28c90 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20    put4byte(28 + 
28ca0 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31  (u8*)pBt->pPage1
28cb0 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50  ->aData, pBt->nP
28cc0 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  age);.    *pPgno
28cd0 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a   = pBt->nPage;..
28ce0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
28cf0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
28d00 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
28d10 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
28d20 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
28d30 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20   ppPage, 1);.   
28d40 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
28d50 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
28d60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
28d70 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
28d80 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
28d90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28da0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
28db0 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  *ppPage);.    }.
28dc0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
28dd0 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e  CATE: %d from en
28de0 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70  d of file\n", *p
28df0 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61  Pgno));.  }..  a
28e00 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
28e10 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
28e20 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c  (pBt) );..end_al
28e30 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72  locate_page:.  r
28e40 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
28e50 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  k);.  releasePag
28e60 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
28e70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28e80 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
28e90 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
28ea0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
28eb0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
28ec0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28ed0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
28ee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28ef0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
28f00 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
28f10 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
28f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
28f30 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  age = 0;.  }.  a
28f40 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
28f50 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
28f60 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28f70 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
28f80 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ge) );.  return 
28f90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
28fa0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
28fb0 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
28fc0 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
28fd0 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
28fe0 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
28ff0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
29000 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
29010 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
29020 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
29030 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
29040 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
29050 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
29060 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
29070 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
29080 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
29090 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
290a0 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
290b0 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
290c0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
290d0 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
290e0 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
290f0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
29100 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
29110 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
29120 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
29130 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
29140 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
29150 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
29160 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
29170 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
29180 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
29190 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
291a0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
291b0 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
291c0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
291d0 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
291e0 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
291f0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
29200 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
29210 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
29220 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
29230 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
29240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29250 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
29260 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
29270 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
29280 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
29290 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
292a0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
292b0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
292c0 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
292d0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
292e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
292f0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
29300 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
29310 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29340 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
29350 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
29360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29370 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
29380 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
29390 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
293a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
293b0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
293c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
293d0 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
293e0 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
293f0 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
29400 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
29410 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
29420 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
29430 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
29440 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
29450 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
29460 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
29470 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
29480 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
29490 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
294a0 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
294b0 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
294c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
294d0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
294e0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
294f0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
29500 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
29510 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
29520 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
29530 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
29540 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
29550 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66   nFree+1);..  if
29560 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65 6c  ( pBt->secureDel
29570 65 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ete ){.    /* If
29580 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
29590 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  te option is ena
295a0 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a  bled, then.    *
295b0 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
295c0 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
295d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
295e0 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a  h zeros..    */.
295f0 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20      if( (!pPage 
29600 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47  && ((rc = btreeG
29610 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67  etPage(pBt, iPag
29620 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
29630 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20  0) ).     ||    
29640 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73          ((rc = s
29650 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29660 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
29670 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0).    ){.   
29680 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
29690 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
296a0 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
296b0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
296c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
296d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
296e0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
296f0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
29700 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
29710 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
29720 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
29730 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
29740 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
29750 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
29760 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75   ){.    ptrmapPu
29770 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
29780 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
29790 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20  , &rc);.    if( 
297a0 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
297b0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
297c0 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
297d0 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
297e0 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
297f0 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
29800 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
29810 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
29820 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
29830 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
29840 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
29850 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
29860 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
29870 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
29880 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
29890 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
298a0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
298b0 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
298c0 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
298d0 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
298e0 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
298f0 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
29900 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
29910 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
29920 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
29930 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
29940 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
29950 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
29960 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
29970 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  !=0 ){.    u32 n
29980 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
29990 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
299a0 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
299b0 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
299c0 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
299d0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
299e0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
299f0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
29a00 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
29a10 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
29a20 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
29a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29a40 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
29a50 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
29a60 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
29a70 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
29a80 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
29a90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e  pBt->usableSize>
29aa0 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  32 );.    if( nL
29ab0 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e  eaf > (u32)pBt->
29ac0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
29ad0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
29ae0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29af0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  PT;.      goto f
29b00 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
29b10 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66   }.    if( nLeaf
29b20 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61   < (u32)pBt->usa
29b30 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
29b40 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
29b50 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
29b60 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
29b70 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
29b80 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
29b90 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
29ba0 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
29bb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
29bc0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
29bd0 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
29be0 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
29bf0 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
29c00 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
29c10 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
29c20 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
29c30 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
29c40 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
29c50 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
29c60 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
29c70 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
29c80 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
29c90 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
29ca0 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
29cb0 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
29cc0 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
29cd0 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
29ce0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
29cf0 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
29d00 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
29d10 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
29d20 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
29d30 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
29d40 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
29d50 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
29d60 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
29d70 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
29d80 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72  ontinue to restr
29d90 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
29da0 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
29db0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
29dc0 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
29dd0 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
29de0 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
29df0 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
29e00 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
29e10 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
29e20 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
29e30 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
29e40 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
29e50 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
29e60 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
29e70 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
29e80 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
29e90 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  8"..      */.   
29ea0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
29eb0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
29ec0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
29ed0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29ee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
29ef0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
29f00 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
29f10 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
29f20 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
29f30 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
29f40 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
29f50 20 69 66 28 20 70 50 61 67 65 20 26 26 20 21 70   if( pPage && !p
29f60 42 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65  Bt->secureDelete
29f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
29f80 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
29f90 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
29fa0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
29fb0 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
29fc0 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
29fd0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
29fe0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
29ff0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
2a000 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
2a010 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
2a020 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
2a030 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
2a040 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2a050 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
2a060 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
2a070 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
2a080 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
2a090 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
2a0a0 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
2a0b0 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
2a0c0 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
2a0d0 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
2a0e0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
2a0f0 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
2a100 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
2a110 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
2a120 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
2a130 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
2a140 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
2a150 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
2a160 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
2a170 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2a180 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
2a190 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
2a1a0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2a1b0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
2a1c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d   */.  if( pPage=
2a1d0 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21  =0 && SQLITE_OK!
2a1e0 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  =(rc = btreeGetP
2a1f0 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
2a200 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20  &pPage, 0)) ){. 
2a210 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
2a220 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _out;.  }.  rc =
2a230 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2a240 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
2a250 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
2a260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
2a270 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2a280 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
2a290 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
2a2a0 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
2a2b0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2a2c0 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
2a2d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2a2e0 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
2a2f0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
2a300 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
2a310 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
2a320 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2a330 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
2a340 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
2a350 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
2a360 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
2a370 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
2a380 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2a390 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
2a3a0 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
2a3b0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2a3c0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
2a3d0 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52   *pPage, int *pR
2a3e0 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29  C){.  if( (*pRC)
2a3f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a400 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61     *pRC = freePa
2a410 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  ge2(pPage->pBt, 
2a420 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67  pPage, pPage->pg
2a430 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
2a440 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
2a450 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2a460 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
2a470 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
2a480 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
2a490 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
2a4a0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
2a4b0 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
2a4c0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2a4d0 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
2a4e0 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
2a4f0 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
2a500 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
2a510 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69    u32 ovflPageSi
2a520 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
2a530 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a540 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2a550 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65 65 50  tex) );.  btreeP
2a560 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
2a570 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
2a580 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
2a590 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
2a5a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a5b0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
2a5c0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
2a5d0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
2a5e0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
2a5f0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
2a600 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
2a610 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
2a620 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
2a630 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
2a640 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
2a650 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
2a660 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
2a670 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
2a680 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
2a690 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
2a6a0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
2a6b0 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
2a6c0 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
2a6d0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
2a6e0 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
2a6f0 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
2a700 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
2a710 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
2a720 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
2a730 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
2a740 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
2a750 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
2a760 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
2a770 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
2a780 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
2a790 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
2a7a0 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
2a7b0 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
2a7c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
2a7d0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
2a7e0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
2a7f0 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
2a800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a810 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2a820 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
2a830 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
2a840 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
2a850 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
2a860 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
2a870 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
2a880 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2a890 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76  }..    if( ( pOv
2a8a0 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20  fl || ((pOvfl = 
2a8b0 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
2a8c0 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21  pBt, ovflPgno))!
2a8d0 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71  =0) ).     && sq
2a8e0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
2a8f0 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44  fcount(pOvfl->pD
2a900 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b  bPage)!=1.    ){
2a910 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20  .      /* There 
2a920 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79  is no reason any
2a930 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68   cursor should h
2a940 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69  ave an outstandi
2a950 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20  ng reference .  
2a960 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65      ** to an ove
2a970 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e  rflow page belon
2a980 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74  ging to a cell t
2a990 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c  hat is being del
2a9a0 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20  eted/updated..  
2a9b0 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65      ** So if the
2a9c0 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74  re exists more t
2a9d0 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
2a9e0 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20  e to this page, 
2a9f0 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a  then it .      *
2aa00 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c  * must not reall
2aa10 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  y be an overflow
2aa20 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61   page and the da
2aa30 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
2aa40 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a  orrupt. .      *
2aa50 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20  * It is helpful 
2aa60 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62  to detect this b
2aa70 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72  efore calling fr
2aa80 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20  eePage2(), as . 
2aa90 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65       ** freePage
2aaa0 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65  2() may zero the
2aab0 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69   page contents i
2aac0 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20  f secure-delete 
2aad0 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a  mode is.      **
2aae0 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69   enabled. If thi
2aaf0 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67  s 'overflow' pag
2ab00 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
2ab10 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a  a page that the.
2ab20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
2ab30 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  is iterating thr
2ab40 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e  ough or using in
2ab50 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c   some other way,
2ab60 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63   this.      ** c
2ab70 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69  an be problemati
2ab80 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  c..      */.    
2ab90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
2aba0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2abb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2abc0 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c  = freePage2(pBt,
2abd0 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f   pOvfl, ovflPgno
2abe0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
2abf0 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( pOvfl ){.     
2ac00 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2ac10 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
2ac20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
2ac30 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ac40 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d  ;.    ovflPgno =
2ac50 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65   iNext;.  }.  re
2ac60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ac70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2ac80 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
2ac90 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
2aca0 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
2acb0 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
2acc0 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
2acd0 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
2ace0 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
2acf0 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
2ad00 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
2ad10 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
2ad20 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
2ad30 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
2ad40 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
2ad50 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
2ad60 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
2ad70 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
2ad80 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
2ad90 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
2ada0 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
2adb0 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
2adc0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
2add0 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
2ade0 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
2adf0 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
2ae00 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
2ae10 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
2ae20 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
2ae30 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
2ae40 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
2ae50 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
2ae60 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
2ae70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2ae80 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
2ae90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aeb0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
2aec0 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
2aed0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2aee0 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
2aef0 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
2af00 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
2af10 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
2af20 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
2af30 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
2af40 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2af50 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
2af60 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
2af70 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af90 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
2afa0 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
2afb0 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
2afc0 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
2afd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afe0 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
2aff0 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
2b000 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
2b010 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
2b020 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
2b030 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
2b040 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
2b050 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
2b060 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
2b070 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
2b080 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
2b090 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2b0a0 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
2b0b0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2b0c0 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
2b0d0 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
2b0e0 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c  t nHeader;.  Cel
2b0f0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61  lInfo info;..  a
2b100 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2b110 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2b120 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2b130 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
2b140 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
2b150 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
2b160 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
2b170 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
2b180 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
2b190 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
2b1a0 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
2b1b0 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
2b1c0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
2b1d0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
2b1e0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
2b1f0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
2b200 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
2b210 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2b220 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2b230 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
2b240 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
2b250 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
2b260 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
2b270 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
2b280 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
2b290 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
2b2a0 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
2b2b0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
2b2c0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
2b2d0 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
2b2e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
2b2f0 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
2b300 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
2b310 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
2b320 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
2b330 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 62 74 72 65  *)&nKey);.  btre
2b340 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2b350 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
2b360 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  o);.  assert( in
2b370 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61  fo.nHeader==nHea
2b380 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
2b390 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
2b3a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
2b3b0 66 6f 2e 6e 44 61 74 61 3d 3d 28 75 33 32 29 28  fo.nData==(u32)(
2b3c0 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a  nData+nZero) );.
2b3d0 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
2b3e0 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
2b3f0 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
2b400 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
2b410 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
2b420 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
2b430 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
2b440 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
2b450 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
2b460 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b 65     if( NEVER(nKe
2b470 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
2b480 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20 20  pKey==0) ){.    
2b490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b4a0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2b4b0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2b4c0 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20   += (int)nKey;. 
2b4d0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
2b4e0 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
2b4f0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
2b500 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
2b510 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
2b520 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
2b530 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
2b540 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
2b550 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
2b560 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
2b570 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
2b580 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
2b590 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69  aceLeft==0 ){.#i
2b5a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b5b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2b5c0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
2b5d0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
2b5e0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
2b5f0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
2b600 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
2b610 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
2b620 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
2b630 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
2b640 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
2b650 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
2b660 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
2b670 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
2b680 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
2b690 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2b6a0 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
2b6b0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2b6c0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
2b6d0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2b6e0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
2b6f0 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
2b700 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
2b710 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2b720 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
2b730 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
2b740 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
2b750 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
2b760 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
2b770 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
2b780 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
2b790 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
2b7a0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
2b7b0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
2b7c0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
2b7d0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
2b7e0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
2b7f0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
2b800 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
2b810 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
2b820 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
2b830 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
2b840 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
2b850 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
2b860 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
2b870 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
2b880 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
2b890 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
2b8a0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
2b8b0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
2b8c0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
2b8d0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
2b8e0 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lised values and
2b8f0 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
2b900 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
2b910 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2b920 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
2b930 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2b940 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
2b950 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b960 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
2b970 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
2b980 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
2b990 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
2b9a0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
2b9b0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
2b9c0 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
2b9d0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
2b9e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2b9f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ba00 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
2ba10 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
2ba20 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2ba30 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ba40 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
2ba50 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2ba60 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
2ba70 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
2ba80 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
2ba90 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
2baa0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
2bab0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
2bac0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
2bad0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
2bae0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
2baf0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
2bb00 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
2bb10 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
2bb20 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2bb30 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
2bb40 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
2bb50 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
2bb60 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
2bb70 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
2bb80 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
2bb90 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
2bba0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
2bbb0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
2bbc0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
2bbd0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
2bbe0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
2bbf0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
2bc10 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2bc20 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2bc30 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
2bc40 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
2bc50 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
2bc60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2bc70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
2bc80 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
2bc90 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
2bca0 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
2bcb0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
2bcc0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
2bcd0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
2bce0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
2bcf0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
2bd00 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2bd10 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
2bd20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
2bd30 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
2bd40 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
2bd50 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  eft;..    /* If 
2bd60 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f  pToRelease is no
2bd70 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79  t zero than pPay
2bd80 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f  load points into
2bd90 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
2bda0 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65     ** of pToRele
2bdb0 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ase.  Make sure 
2bdc0 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74  pToRelease is st
2bdd0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a  ill writeable. *
2bde0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  /.    assert( pT
2bdf0 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73  oRelease==0 || s
2be00 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2be10 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73  teable(pToReleas
2be20 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
2be30 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f      /* If pPaylo
2be40 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ad is part of th
2be50 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70  e data area of p
2be60 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20  Page, then make 
2be70 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a  sure pPage.    *
2be80 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  * is still write
2be90 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65  able */.    asse
2bea0 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61  rt( pPayload<pPa
2beb0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61  ge->aData || pPa
2bec0 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61  yload>=&pPage->a
2bed0 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
2bee0 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
2bef0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
2bf00 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
2bf10 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
2bf20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b     if( nSrc>0 ){
2bf30 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72  .      if( n>nSr
2bf40 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20  c ) n = nSrc;.  
2bf50 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
2bf60 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
2bf70 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
2bf80 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2bf90 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
2bfa0 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
2bfb0 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
2bfc0 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c   -= n;.    pPayl
2bfd0 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
2bfe0 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
2bff0 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
2c000 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
2c010 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20  if( nSrc==0 ){. 
2c020 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74       nSrc = nDat
2c030 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20  a;.      pSrc = 
2c040 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  pData;.    }.  }
2c050 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2c060 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65  ToRelease);.  re
2c070 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c080 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
2c090 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
2c0a0 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
2c0b0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
2c0c0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
2c0d0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2c0e0 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
2c0f0 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
2c100 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
2c110 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
2c120 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
2c130 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
2c140 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
2c150 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
2c160 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
2c170 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
2c180 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
2c190 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
2c1a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2c1b0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
2c1c0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
2c1d0 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
2c1e0 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
2c1f0 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b  t sz, int *pRC){
2c200 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20  .  u32 pc;      
2c210 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2c220 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20  cell content of 
2c230 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  cell being delet
2c240 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ed */.  u8 *data
2c250 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  ;       /* pPage
2c260 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20  ->aData */.  u8 
2c270 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  *ptr;        /* 
2c280 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74  Used to move byt
2c290 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e  es around within
2c2a0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
2c2b0 2a 65 6e 64 50 74 72 3b 20 20 20 20 20 2f 2a 20  *endPtr;     /* 
2c2c0 45 6e 64 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  End of loop */. 
2c2d0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2c2e0 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
2c2f0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ode */.  int hdr
2c300 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  ;        /* Begi
2c310 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68 65 61  nning of the hea
2c320 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70 61 67  der.  0 most pag
2c330 65 73 2e 20 20 31 30 30 20 70 61 67 65 20 31 20  es.  100 page 1 
2c340 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
2c350 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
2c360 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
2c370 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2c380 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d  ;.  assert( sz==
2c390 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  cellSize(pPage, 
2c3a0 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  idx) );.  assert
2c3b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2c3c0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2c3d0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
2c3e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2c3f0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
2c400 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
2c410 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
2c420 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
2c430 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
2c440 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b  Offset + 2*idx];
2c450 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  .  pc = get2byte
2c460 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70  (ptr);.  hdr = p
2c470 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
2c480 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d  .  testcase( pc=
2c490 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
2c4a0 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73  hdr+5]) );.  tes
2c4b0 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50  tcase( pc+sz==pP
2c4c0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2c4d0 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63  Size );.  if( pc
2c4e0 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65   < (u32)get2byte
2c4f0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c  (&data[hdr+5]) |
2c500 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d  | pc+sz > pPage-
2c510 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
2c520 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53   ){.    *pRC = S
2c530 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c540 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
2c550 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53    }.  rc = freeS
2c560 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20  pace(pPage, pc, 
2c570 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  sz);.  if( rc ){
2c580 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
2c590 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2c5a0 20 20 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61    endPtr = &data
2c5b0 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
2c5c0 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
2c5d0 65 6c 6c 20 2d 20 32 5d 3b 0a 20 20 61 73 73 65  ell - 2];.  asse
2c5e0 72 74 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f  rt( (SQLITE_PTR_
2c5f0 54 4f 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d  TO_INT(ptr)&1)==
2c600 30 20 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20  0 );  /* ptr is 
2c610 61 6c 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c  always 2-byte al
2c620 69 67 6e 65 64 20 2a 2f 0a 20 20 77 68 69 6c 65  igned */.  while
2c630 28 20 70 74 72 3c 65 6e 64 50 74 72 20 29 7b 0a  ( ptr<endPtr ){.
2c640 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72 20 3d      *(u16*)ptr =
2c650 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 32 5d 3b   *(u16*)&ptr[2];
2c660 0a 20 20 20 20 70 74 72 20 2b 3d 20 32 3b 0a 20  .    ptr += 2;. 
2c670 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
2c680 6c 2d 2d 3b 0a 20 20 70 75 74 32 62 79 74 65 28  l--;.  put2byte(
2c690 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
2c6a0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70  age->nCell);.  p
2c6b0 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
2c6c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
2c6d0 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
2c6e0 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
2c6f0 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
2c700 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
2c710 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
2c720 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
2c730 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2c740 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
2c750 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
2c760 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
2c770 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
2c780 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
2c790 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
2c7a0 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
2c7b0 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
2c7c0 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
2c7d0 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
2c7e0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
2c7f0 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
2c800 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
2c810 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
2c820 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
2c830 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
2c840 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
2c850 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
2c860 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
2c870 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
2c880 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
2c890 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
2c8a0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
2c8b0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
2c8c0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
2c8d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
2c8e0 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
2c8f0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
2c900 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
2c910 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
2c920 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
2c930 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
2c940 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
2c950 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2c960 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
2c970 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2c980 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
2c990 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
2c9a0 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
2c9b0 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
2c9c0 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
2c9d0 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
2c9e0 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
2c9f0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
2ca00 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
2ca10 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
2ca20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
2ca30 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
2ca40 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
2ca50 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
2ca60 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
2ca70 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
2ca80 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2ca90 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
2caa0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
2cab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
2cac0 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
2cad0 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
2cae0 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
2caf0 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
2cb00 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
2cb10 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
2cb20 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
2cb30 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
2cb40 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
2cb50 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
2cb60 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
2cb70 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
2cb80 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
2cb90 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
2cba0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2cbb0 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
2cbc0 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
2cbd0 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
2cbe0 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
2cbf0 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
2cc00 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2cc10 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  er */.  int end;
2cc20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
2cc30 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
2cc40 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
2cc50 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
2cc60 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
2cc70 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
2cc80 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
2cc90 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
2cca0 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
2ccb0 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
2ccc0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
2ccd0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
2cce0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
2ccf0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
2cd00 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
2cd10 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
2cd20 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
2cd30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
2cd40 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
2cd50 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
2cd60 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
2cd70 75 38 20 2a 65 6e 64 50 74 72 3b 20 20 20 20 20  u8 *endPtr;     
2cd80 20 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20    /* End of the 
2cd90 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  loop */..  int n
2cda0 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64 20 3f  Skip = (iChild ?
2cdb0 20 34 20 3a 20 30 29 3b 0a 0a 20 20 69 66 28 20   4 : 0);..  if( 
2cdc0 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
2cdd0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
2cde0 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
2cdf0 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
2ce00 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
2ce10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
2ce20 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2ce30 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ) && MX_CELL(pPa
2ce40 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
2ce50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2ce60 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
2ce70 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
2ce80 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  aOvfl) );.  asse
2ce90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2cea0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2ceb0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
2cec0 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
2ced0 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
2cee0 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
2cef0 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
2cf00 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
2cf10 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
2cf20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
2cf30 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
2cf40 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
2cf50 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
2cf60 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
2cf70 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
2cf80 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
2cf90 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
2cfa0 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
2cfb0 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
2cfc0 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
2cfd0 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
2cfe0 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
2cff0 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
2d000 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
2d010 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
2d020 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
2d030 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
2d040 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  Page, pCell) || 
2d050 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64  (sz==8 && iChild
2d060 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  >0) );.  if( pPa
2d070 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
2d080 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
2d090 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
2d0a0 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
2d0b0 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
2d0c0 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
2d0d0 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
2d0e0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
2d0f0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69    }.    if( iChi
2d100 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
2d110 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69  byte(pCell, iChi
2d120 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a  ld);.    }.    j
2d130 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66   = pPage->nOverf
2d140 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72  low++;.    asser
2d150 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f  t( j<(int)(sizeo
2d160 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f  f(pPage->aOvfl)/
2d170 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
2d180 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20  vfl[0])) );.    
2d190 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e  pPage->aOvfl[j].
2d1a0 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
2d1b0 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b     pPage->aOvfl[
2d1c0 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b  j].idx = (u16)i;
2d1d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
2d1e0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
2d1f0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2d200 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2d210 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d220 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20  ){.      *pRC = 
2d230 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
2d240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2d250 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2d260 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
2d270 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
2d280 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
2d290 3e 61 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c  >aData;.    cell
2d2a0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
2d2b0 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
2d2c0 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
2d2d0 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
2d2e0 6c 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  l;.    ins = cel
2d2f0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
2d300 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
2d310 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c  Space(pPage, sz,
2d320 20 26 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20   &idx);.    if( 
2d330 72 63 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b  rc ){ *pRC = rc;
2d340 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f   return; }.    /
2d350 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70  * The allocateSp
2d360 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75  ace() routine gu
2d370 61 72 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c  arantees the fol
2d380 6c 6f 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65  lowing two prope
2d390 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20  rties.    ** if 
2d3a0 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65  it returns succe
2d3b0 73 73 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ss */.    assert
2d3c0 28 20 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29  ( idx >= end+2 )
2d3d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
2d3e0 78 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61  x+sz <= (int)pPa
2d3f0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2d400 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ize );.    pPage
2d410 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
2d420 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28  Page->nFree -= (
2d430 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20  u16)(2 + sz);.  
2d440 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
2d450 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
2d460 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
2d470 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c  );.    if( iChil
2d480 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
2d490 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  yte(&data[idx], 
2d4a0 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
2d4b0 20 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 65     ptr = &data[e
2d4c0 6e 64 5d 3b 0a 20 20 20 20 65 6e 64 50 74 72 20  nd];.    endPtr 
2d4d0 3d 20 26 64 61 74 61 5b 69 6e 73 5d 3b 0a 20 20  = &data[ins];.  
2d4e0 20 20 61 73 73 65 72 74 28 20 28 53 51 4c 49 54    assert( (SQLIT
2d4f0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 74 72  E_PTR_TO_INT(ptr
2d500 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 70  )&1)==0 );  /* p
2d510 74 72 20 69 73 20 61 6c 77 61 79 73 20 32 2d 62  tr is always 2-b
2d520 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f 0a 20  yte aligned */. 
2d530 20 20 20 77 68 69 6c 65 28 20 70 74 72 3e 65 6e     while( ptr>en
2d540 64 50 74 72 20 29 7b 0a 20 20 20 20 20 20 2a 28  dPtr ){.      *(
2d550 75 31 36 2a 29 70 74 72 20 3d 20 2a 28 75 31 36  u16*)ptr = *(u16
2d560 2a 29 26 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20  *)&ptr[-2];.    
2d570 20 20 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20    ptr -= 2;.    
2d580 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
2d590 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
2d5a0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
2d5b0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2d5c0 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  fset+3], pPage->
2d5d0 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20  nCell);.#ifndef 
2d5e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2d5f0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2d600 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
2d610 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
2d620 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
2d630 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
2d640 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2d650 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
2d660 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
2d670 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
2d680 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
2d690 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2d6a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
2d6b0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2d6c0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
2d6d0 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  pRC);.    }.#end
2d6e0 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
2d6f0 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
2d700 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
2d710 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
2d720 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
2d730 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
2d740 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
2d750 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
2d760 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
2d770 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
2d780 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d790 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
2d7a0 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
2d7b0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
2d7c0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
2d7d0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
2d7e0 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
2d7f0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2d800 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
2d810 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
2d820 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
2d830 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
2d840 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
2d850 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
2d860 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2d870 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
2d880 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20    u8 *pCellptr; 
2d890 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2d8a0 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
2d8b0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
2d8c0 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
2d8d0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
2d8e0 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
2d8f0 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
2d900 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
2d910 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2d920 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
2d930 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2d940 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
2d950 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
2d960 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2d970 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50   of header on pP
2d980 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
2d990 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61  nt nUsable = pPa
2d9a0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2d9b0 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73  ize; /* Usable s
2d9c0 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a  ize of page */..
2d9d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2d9e0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2d9f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2da00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2da10 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2da20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
2da30 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c  ell>=0 && nCell<
2da40 3d 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50  =(int)MX_CELL(pP
2da50 61 67 65 2d 3e 70 42 74 29 0a 20 20 20 20 20 20  age->pBt).      
2da60 20 20 20 20 20 20 26 26 20 28 69 6e 74 29 4d 58        && (int)MX
2da70 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2da80 29 3c 3d 31 30 39 32 31 29 3b 0a 20 20 61 73 73  )<=10921);.  ass
2da90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2daa0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
2dab0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
2dac0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
2dad0 20 74 68 65 20 70 61 67 65 20 68 61 73 20 6a 75   the page has ju
2dae0 73 74 20 62 65 65 6e 20 7a 65 72 6f 65 64 20 62  st been zeroed b
2daf0 79 20 7a 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a  y zeroPage() */.
2db00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2db10 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61  >nCell==0 );.  a
2db20 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 4e  ssert( get2byteN
2db30 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
2db40 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29 3b  +5])==nUsable );
2db50 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26  ..  pCellptr = &
2db60 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
2db70 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a 32  Offset + nCell*2
2db80 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20  ];.  cellbody = 
2db90 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69  nUsable;.  for(i
2dba0 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20  =nCell-1; i>=0; 
2dbb0 69 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  i--){.    u16 sz
2dbc0 20 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20   = aSize[i];.   
2dbd0 20 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a   pCellptr -= 2;.
2dbe0 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20      cellbody -= 
2dbf0 73 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  sz;.    put2byte
2dc00 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62  (pCellptr, cellb
2dc10 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ody);.    memcpy
2dc20 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
2dc30 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29  , apCell[i], sz)
2dc40 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
2dc50 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
2dc60 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
2dc70 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
2dc80 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61  cellbody);.  pPa
2dc90 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43  ge->nFree -= (nC
2dca0 65 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20  ell*2 + nUsable 
2dcb0 2d 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70  - cellbody);.  p
2dcc0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75  Page->nCell = (u
2dcd0 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a  16)nCell;.}../*.
2dce0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2dcf0 20 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65   parameters dete
2dd00 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61  rmine how many a
2dd10 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65  djacent pages ge
2dd20 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e  t involved.** in
2dd30 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65   a balancing ope
2dd40 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74  ration.  NN is t
2dd50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69  he number of nei
2dd60 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
2dd70 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20   side.** of the 
2dd80 70 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63  page that partic
2dd90 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c  ipate in the bal
2dda0 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
2ddb0 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20  .  NB is the.** 
2ddc0 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
2ddd0 70 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69  pages that parti
2dde0 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e  cipate, includin
2ddf0 67 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67  g the target pag
2de00 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67  e and.** NN neig
2de10 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2de20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  side..**.** The 
2de30 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66  minimum value of
2de40 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75   NN is 1 (of cou
2de50 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e  rse).  Increasin
2de60 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20  g NN above 1.** 
2de70 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65  (to 2 or 3) give
2de80 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f  s a modest impro
2de90 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54  vement in SELECT
2dea0 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66   and DELETE perf
2deb0 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78  ormance.** in ex
2dec0 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72  change for a lar
2ded0 67 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20  ger degradation 
2dee0 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50  in INSERT and UP
2def0 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  DATE performance
2df00 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f  ..** The value o
2df10 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20  f NN appears to 
2df20 67 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65  give the best re
2df30 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a  sults overall..*
2df40 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20  /.#define NN 1  
2df50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2df60 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
2df70 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2df80 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65   of pPage */.#de
2df90 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29  fine NB (NN*2+1)
2dfa0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70        /* Total p
2dfb0 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  ages involved in
2dfc0 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a   the balance */.
2dfd0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2dfe0 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
2dff0 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65  CE./*.** This ve
2e000 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65  rsion of balance
2e010 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63  () handles the c
2e020 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61  ommon special ca
2e030 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65  se where.** a ne
2e040 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67  w entry is being
2e050 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65   inserted on the
2e060 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65   extreme right-e
2e070 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65  nd of the.** tre
2e080 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  e, in other word
2e090 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20  s, when the new 
2e0a0 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d  entry will becom
2e0b0 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a  e the largest.**
2e0c0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
2e0d0 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ee..**.** Instea
2e0e0 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62  d of trying to b
2e0f0 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67  alance the 3 rig
2e100 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67  ht-most leaf pag
2e110 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20  es, just add.** 
2e120 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
2e130 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2e140 65 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e  e and put the on
2e150 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a  e new entry in.*
2e160 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  * that page.  Th
2e170 69 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69  is leaves the ri
2e180 67 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20  ght side of the 
2e190 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a  tree somewhat.**
2e1a0 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75   unbalanced.  Bu
2e1b0 74 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20  t odds are that 
2e1c0 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  we will be inser
2e1d0 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73  ting new entries
2e1e0 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73  .** at the end s
2e1f0 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73  oon afterwards s
2e200 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70  o the nearly emp
2e210 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69  ty page will qui
2e220 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e  ckly.** fill up.
2e230 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a    On average..**
2e240 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65  .** pPage is the
2e250 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
2e260 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   is the right-mo
2e270 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74  st page in the t
2e280 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20  ree..** pParent 
2e290 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  is its parent.  
2e2a0 70 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20  pPage must have 
2e2b0 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f  a single overflo
2e2c0 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68  w entry.** which
2e2d0 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67   is also the rig
2e2e0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e  ht-most entry on
2e2f0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   the page..**.**
2e300 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
2e310 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  er is used to st
2e320 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ore a temporary 
2e330 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69  copy of the divi
2e340 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74  der.** cell that
2e350 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65   will be inserte
2e360 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20  d into pParent. 
2e370 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73  Such a cell cons
2e380 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62  ists of a 4.** b
2e390 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2e3a0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61  followed by a va
2e3b0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2e3c0 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a  teger. In other.
2e3d0 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73  ** words, at mos
2e3e0 74 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63  t 13 bytes. Henc
2e3f0 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
2e400 66 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a  fer must be at.*
2e410 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73  * least 13 bytes
2e420 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
2e430 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2e440 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70  quick(MemPage *p
2e450 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20  Parent, MemPage 
2e460 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61  *pPage, u8 *pSpa
2e470 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ce){.  BtShared 
2e480 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61  *const pBt = pPa
2e490 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42  ge->pBt;    /* B
2e4a0 2d 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a  -Tree Database *
2e4b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  /.  MemPage *pNe
2e4c0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2e4d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
2e4e0 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  y allocated page
2e4f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
2e500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2e520 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50  turn Code */.  P
2e530 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20  gno pgnoNew;    
2e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e550 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
2e560 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20  er of pNew */.. 
2e570 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e580 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
2e590 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
2e5a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2e5b0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2e5c0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2e5d0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
2e5e0 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2e5f0 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  low==1 );..  /* 
2e600 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69  This error condi
2e610 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67  tion is now caug
2e620 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
2e630 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  hing this functi
2e640 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  on */.  if( pPag
2e650 65 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65  e->nCell<=0 ) re
2e660 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2e670 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20  UPT_BKPT;..  /* 
2e680 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2e690 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77  age. This page w
2e6a0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72  ill become the r
2e6b0 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20  ight-sibling of 
2e6c0 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b  .  ** pPage. Mak
2e6d0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
2e6e0 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74  e writable, so t
2e6f0 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  hat the new divi
2e700 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61  der cell.  ** ma
2e710 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49  y be inserted. I
2e720 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65  f both these ope
2e730 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63  rations are succ
2e740 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e  essful, proceed.
2e750 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c  .  */.  rc = all
2e760 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2e770 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
2e780 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69  New, 0, 0);..  i
2e790 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e7a0 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75   ){..    u8 *pOu
2e7b0 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a  t = &pSpace[4];.
2e7c0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
2e7d0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e  pPage->aOvfl[0].
2e7e0 70 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73  pCell;.    u16 s
2e7f0 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65  zCell = cellSize
2e800 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
2e810 29 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70  );.    u8 *pStop
2e820 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ;..    assert( s
2e830 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2e840 74 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62  teable(pNew->pDb
2e850 50 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73  Page) );.    ass
2e860 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
2e870 61 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45  a[0]==(PTF_INTKE
2e880 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
2e890 54 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20  TF_LEAF) );.    
2e8a0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50  zeroPage(pNew, P
2e8b0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2e8c0 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
2e8d0 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
2e8e0 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65  ge(pNew, 1, &pCe
2e8f0 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20  ll, &szCell);.. 
2e900 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2e910 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
2e920 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
2e930 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2e940 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74  .    ** with ent
2e950 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77  ries for the new
2e960 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70   page, and any p
2e970 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ointer from the 
2e980 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2e990 74 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f  the page to an o
2e9a0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
2e9b0 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65   either of these
2e9c0 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  .    ** operatio
2e9d0 6e 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65  ns fails, the re
2e9e0 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74  turn code is set
2e9f0 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e  , but the conten
2ea00 74 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  ts.    ** of the
2ea10 20 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65   parent page are
2ea20 20 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74   still manipulat
2ea30 65 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62  ed by thh code b
2ea40 65 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61  elow..    ** Tha
2ea50 74 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73  t is Ok, at this
2ea60 20 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e   point the paren
2ea70 74 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e  t page is guaran
2ea80 74 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  teed to.    ** b
2ea90 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
2eaa0 79 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20  y. Returning an 
2eab0 65 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20  error code will 
2eac0 63 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72  cause a.    ** r
2ead0 6f 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67  ollback, undoing
2eae0 20 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64   any changes mad
2eaf0 65 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  e to the parent 
2eb00 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2eb10 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2eb20 4d 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  M ){.      ptrma
2eb30 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
2eb40 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
2eb50 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20   pParent->pgno, 
2eb60 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
2eb70 73 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e  szCell>pNew->min
2eb80 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
2eb90 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2eba0 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26  r(pNew, pCell, &
2ebb0 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
2ebc0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65   }.  .    /* Cre
2ebd0 61 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65  ate a divider ce
2ebe0 6c 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  ll to insert int
2ebf0 6f 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64  o pParent. The d
2ec00 69 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20  ivider cell.    
2ec10 2a 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ** consists of a
2ec20 20 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4-byte page num
2ec30 62 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75  ber (the page nu
2ec40 6d 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61  mber of pPage) a
2ec50 6e 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69  nd.    ** a vari
2ec60 61 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20  able length key 
2ec70 76 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73  value (which mus
2ec80 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61  t be the same va
2ec90 6c 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a  lue as the.    *
2eca0 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e  * largest key on
2ecb0 20 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a   pPage)..    **.
2ecc0 20 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74      ** To find t
2ecd0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76  he largest key v
2ece0 61 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66  alue on pPage, f
2ecf0 69 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69  irst find the ri
2ed00 67 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a  ght-most .    **
2ed10 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20   cell on pPage. 
2ed20 54 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69  The first two fi
2ed30 65 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c  elds of this cel
2ed40 6c 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a  l are the .    *
2ed50 2a 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20  * record-length 
2ed60 28 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67  (a variable leng
2ed70 74 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f  th integer at mo
2ed80 73 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69  st 32-bits in si
2ed90 7a 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  ze).    ** and t
2eda0 68 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20  he key value (a 
2edb0 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
2edc0 69 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76  integer, may hav
2edd0 65 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20  e any value)..  
2ede0 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f    ** The first o
2edf0 66 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29  f the while(...)
2ee00 20 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69   loops below ski
2ee10 70 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f  ps over the reco
2ee20 72 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a  rd-length.    **
2ee30 20 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f   field. The seco
2ee40 6e 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f  nd while(...) lo
2ee50 6f 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65  op copies the ke
2ee60 79 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65  y value from the
2ee70 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20  .    ** cell on 
2ee80 70 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70  pPage into the p
2ee90 53 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20  Space buffer..  
2eea0 20 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d    */.    pCell =
2eeb0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2eec0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
2eed0 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70  ;.    pStop = &p
2eee0 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Cell[9];.    whi
2eef0 6c 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26  le( (*(pCell++)&
2ef00 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
2ef10 53 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f  Stop );.    pSto
2ef20 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
2ef30 20 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f     while( ((*(pO
2ef40 75 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b  ut++) = *(pCell+
2ef50 2b 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65  +))&0x80) && pCe
2ef60 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20  ll<pStop );..   
2ef70 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
2ef80 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ew divider cell 
2ef90 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f  into pParent. */
2efa0 0a 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28  .    insertCell(
2efb0 70 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74  pParent, pParent
2efc0 2d 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c  ->nCell, pSpace,
2efd0 20 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61   (int)(pOut-pSpa
2efe0 63 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ce),.           
2eff0 20 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67      0, pPage->pg
2f000 6e 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f  no, &rc);..    /
2f010 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d  * Set the right-
2f020 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
2f030 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e   pParent to poin
2f040 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
2f050 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  e. */.    put4by
2f060 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
2f070 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2f080 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
2f090 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  w);.  .    /* Re
2f0a0 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
2f0b0 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
2f0c0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65  age. */.    rele
2f0d0 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
2f0e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2f0f0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2f100 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
2f110 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a  LANCE */..#if 0.
2f120 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2f130 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
2f140 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67  tribute anything
2f150 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2f160 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20  n of SQLite..** 
2f170 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  it is sometimes 
2f180 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72  activated tempor
2f190 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75  arily while debu
2f1a0 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f  gging code respo
2f1b0 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73  nsible .** for s
2f1c0 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d  etting pointer-m
2f1d0 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  ap entries..*/.s
2f1e0 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
2f1f0 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61  CheckPages(MemPa
2f200 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74  ge **apPage, int
2f210 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69   nPage){.  int i
2f220 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  , j;.  for(i=0; 
2f230 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  i<nPage; i++){. 
2f240 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75     Pgno n;.    u
2f250 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  8 e;.    MemPage
2f260 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65   *pPage = apPage
2f270 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65  [i];.    BtShare
2f280 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2f290 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
2f2a0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2f2b0 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ;..    for(j=0; 
2f2c0 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  j<pPage->nCell; 
2f2d0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c  j++){.      Cell
2f2e0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
2f2f0 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20   u8 *z;.     .  
2f300 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c      z = findCell
2f310 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20  (pPage, j);.    
2f320 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
2f330 50 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69  Ptr(pPage, z, &i
2f340 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nfo);.      if( 
2f350 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
2f360 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f  {.        Pgno o
2f370 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
2f380 7a 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  z[info.iOverflow
2f390 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d  ]);.        ptrm
2f3a0 61 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c  apGet(pBt, ovfl,
2f3b0 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2f3c0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2f3d0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2f3e0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
2f3f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f400 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2f410 66 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  f ){.        Pgn
2f420 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
2f430 74 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70  te(z);.        p
2f440 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
2f450 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
2f460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d        assert( n=
2f470 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20  =pPage->pgno && 
2f480 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
2f490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f4a0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2f4b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
2f4c0 67 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34  gno child = get4
2f4d0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2f4e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2f4f0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70  set+8]);.      p
2f500 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68  trmapGet(pBt, ch
2f510 69 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20  ild, &e, &n);.  
2f520 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
2f530 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
2f540 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
2f550 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2f560 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
2f570 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2f580 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
2f590 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
2f5a0 73 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  s of the b-tree 
2f5b0 6e 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20  node stored .** 
2f5c0 6f 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  on page pFrom to
2f5d0 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61   page pTo. If pa
2f5e0 67 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74  ge pFrom was not
2f5f0 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
2f600 65 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  en.** the pointe
2f610 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
2f620 72 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67  r each child pag
2f630 65 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f  e are updated so
2f640 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72   that the.** par
2f650 65 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20  ent page stored 
2f660 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  in the pointer m
2f670 61 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20  ap is page pTo. 
2f680 49 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e  If pFrom contain
2f690 65 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20  ed.** any cells 
2f6a0 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  with overflow pa
2f6b0 67 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65  ge pointers, the
2f6c0 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  n the correspond
2f6d0 69 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  ing pointer.** m
2f6e0 61 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61  ap entries are a
2f6f0 6c 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74  lso updated so t
2f700 68 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  hat the parent p
2f710 61 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e  age is page pTo.
2f720 0a 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20  .**.** If pFrom 
2f730 69 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72  is currently car
2f740 72 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c  rying any overfl
2f750 6f 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65  ow cells (entrie
2f760 73 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50  s in the.** MemP
2f770 61 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61  age.aOvfl[] arra
2f780 79 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74  y), they are not
2f790 20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20   copied to pTo. 
2f7a0 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
2f7b0 74 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54  turning, page pT
2f7c0 6f 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a  o is reinitializ
2f7d0 65 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e  ed using btreeIn
2f7e0 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
2f7f0 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
2f800 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2f810 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
2f820 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
2f830 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
2f840 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
2f850 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
2f860 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
2f870 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
2f880 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
2f890 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
2f8a0 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
2f8b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2f8c0 64 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  d copyNodeConten
2f8d0 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
2f8e0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20  , MemPage *pTo, 
2f8f0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
2f900 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
2f910 4f 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  OK ){.    BtShar
2f920 65 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d  ed * const pBt =
2f930 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20   pFrom->pBt;.   
2f940 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f   u8 * const aFro
2f950 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61  m = pFrom->aData
2f960 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74  ;.    u8 * const
2f970 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74   aTo = pTo->aDat
2f980 61 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74  a;.    int const
2f990 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
2f9a0 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
2f9b0 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
2f9c0 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
2f9d0 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
2f9e0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
2f9f0 20 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20   int iData;.  . 
2fa00 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46   .    assert( pF
2fa10 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  rom->isInit );. 
2fa20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d     assert( pFrom
2fa30 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
2fa40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
2fa50 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
2fa60 46 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28  FromHdr+5]) <= (
2fa70 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
2fa80 69 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  ize );.  .    /*
2fa90 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
2faa0 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
2fab0 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
2fac0 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
2fad0 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
2fae0 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2faf0 64 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63  dr+5]);.    memc
2fb00 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20  py(&aTo[iData], 
2fb10 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70  &aFrom[iData], p
2fb20 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69  Bt->usableSize-i
2fb30 44 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70  Data);.    memcp
2fb40 79 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20  y(&aTo[iToHdr], 
2fb50 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d  &aFrom[iFromHdr]
2fb60 2c 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66  , pFrom->cellOff
2fb70 73 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e  set + 2*pFrom->n
2fb80 43 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  Cell);.  .    /*
2fb90 20 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61   Reinitialize pa
2fba0 67 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74  ge pTo so that t
2fbb0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2fbc0 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
2fbd0 74 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63  ture.    ** matc
2fbe0 68 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20  h the new data. 
2fbf0 54 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  The initializati
2fc00 6f 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63  on of pTo can ac
2fc10 74 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65  tually fail unde
2fc20 72 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20  r.    ** fairly 
2fc30 6f 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74  obscure circumst
2fc40 61 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75  ances, even thou
2fc50 67 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20  gh it is a copy 
2fc60 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of initialized .
2fc70 20 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f      ** page pFro
2fc80 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  m..    */.    pT
2fc90 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
2fca0 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
2fcb0 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20  tPage(pTo);.    
2fcc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fcd0 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  K ){.      *pRC 
2fce0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
2fcf0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rn;.    }.  .   
2fd00 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2fd10 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2fd20 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
2fd30 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2fd40 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f  ntries.    ** fo
2fd50 72 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20  r any b-tree or 
2fd60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
2fd70 68 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74  hat pTo now cont
2fd80 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2fd90 73 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  s to..    */.   
2fda0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2fdb0 4d 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20  M ){.      *pRC 
2fdc0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
2fdd0 73 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  s(pTo);.    }.  
2fde0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
2fdf0 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
2fe00 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74  butes cells on t
2fe10 68 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68  he iParentIdx'th
2fe20 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e   child of pParen
2fe30 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20  t.** (hereafter 
2fe40 22 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20  "the page") and 
2fe50 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73  up to 2 siblings
2fe60 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
2fe70 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
2fe80 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74  e.** same amount
2fe90 20 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20   of free space. 
2fea0 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65  Usually a single
2feb0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68   sibling on eith
2fec0 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a  er side of the.*
2fed0 2a 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20  * page are used 
2fee0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
2fef0 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69  , though both si
2ff00 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
2ff10 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69  e from one.** si
2ff20 64 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69  de if the page i
2ff30 73 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c  s the first or l
2ff40 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73  ast child of its
2ff50 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20   parent. If the 
2ff60 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77  page .** has few
2ff70 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e  er than 2 siblin
2ff80 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68  gs (something wh
2ff90 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  ich can only hap
2ffa0 70 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a  pen if the page.
2ffb0 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67  ** is a root pag
2ffc0 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20  e or a child of 
2ffd0 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65  a root page) the
2ffe0 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  n all available 
2fff0 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74  siblings.** part
30000 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
30010 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
30020 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
30030 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61  blings of the pa
30040 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
30050 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
30060 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72  ed by .** one or
30070 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72   two in an effor
30080 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20  t to keep pages 
30090 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20  nearly full but 
300a0 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a  not over full. .
300b0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
300c0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
300d0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d  e is called, som
300e0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
300f0 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69  n the page.** mi
30100 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ght not actually
30110 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65   be stored in Me
30120 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54  mPage.aData[]. T
30130 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a  his can happen.*
30140 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
30150 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20   overfull. This 
30160 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
30170 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61  that all cells a
30180 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74  llocated.** to t
30190 68 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20  he page and its 
301a0 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74  siblings fit int
301b0 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  o MemPage.aData[
301c0 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ] before returni
301d0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  ng..**.** In the
301e0 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
301f0 63 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e  cing the page an
30200 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20  d its siblings, 
30210 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20  cells may be.** 
30220 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72  inserted into or
30230 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
30240 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70  e parent page (p
30250 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73  Parent). Doing s
30260 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74  o.** may cause t
30270 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74  he parent page t
30280 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  o become overful
30290 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
302a0 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65  If this.** happe
302b0 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65  ns, it is the re
302c0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
302d0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e  the caller to in
302e0 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74  voke the correct
302f0 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  .** balancing ro
30300 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69  utine to fix thi
30310 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74  s problem (see t
30320 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75  he balance() rou
30330 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  tine). .**.** If
30340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
30350 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73  ils for any reas
30360 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61  on, it might lea
30370 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ve the database.
30380 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65  ** in a corrupte
30390 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74  d state. So if t
303a0 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c  his routine fail
303b0 73 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  s, the database 
303c0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c  should.** be rol
303d0 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
303e0 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
303f0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
30400 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c  ion, aOvflSpace,
30410 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
30420 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67   a.** buffer big
30430 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
30440 6f 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69  one page. If whi
30450 6c 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c  le inserting cel
30460 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
30470 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72  nt.** page (pPar
30480 65 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20  ent) the parent 
30490 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
304a0 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
304b0 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
304c0 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
304d0 74 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  t's overflow cel
304e0 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73  ls. Because this
304f0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74   function insert
30500 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f  s.** a maximum o
30510 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63  f four divider c
30520 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
30530 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74  rent page, and t
30540 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69  he maximum.** si
30550 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f  ze of a cell sto
30560 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e  red within an in
30570 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61  ternal node is a
30580 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20  lways less than 
30590 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  1/4.** of the pa
305a0 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76  ge-size, the aOv
305b0 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72  flSpace[] buffer
305c0 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
305d0 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e  o be large.** en
305e0 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65  ough for all ove
305f0 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a  rflow cells..**.
30600 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65  ** If aOvflSpace
30610 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c   is set to a nul
30620 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  l pointer, this 
30630 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
30640 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   .** SQLITE_NOME
30650 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  M..*/.static int
30660 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
30670 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
30680 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  rent,           
30690 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
306a0 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62  ge of siblings b
306b0 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f  eing balanced */
306c0 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64  .  int iParentId
306d0 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
306e0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22     /* Index of "
306f0 74 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61  the page" in pPa
30700 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f  rent */.  u8 *aO
30710 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20  vflSpace,       
30720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67            /* pag
30730 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20  e-size bytes of 
30740 73 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74  space for parent
30750 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   ovfl */.  int i
30760 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20  sRoot           
30770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
30780 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73  ue if pParent is
30790 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a   a root-page */.
307a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
307b0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
307c0 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64    /* The whole d
307d0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
307e0 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20   nCell = 0;     
307f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
30800 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
30810 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e  apCell[] */.  in
30820 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b  t nMaxCells = 0;
30830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
30840 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
30850 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20  apCell, szCell, 
30860 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20  aFrom. */.  int 
30870 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20  nNew = 0;       
30880 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
30890 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
308a0 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pNew[] */.  int 
308b0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
308c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
308d0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61  er of pages in a
308e0 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  pOld[] */.  int 
308f0 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20  i, j, k;        
30900 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
30910 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
30920 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
30930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
30940 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
30950 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
30960 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
30970 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30980 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
30990 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
309a0 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16 leafCorrectio
309b0 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
309c0 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
309d0 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
309e0 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
309f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30a00 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
30a10 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
30a20 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
30a30 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
30a40 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
30a50 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
30a60 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
30a70 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
30a80 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
30a90 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
30aa0 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
30ab0 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
30ac0 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
30ad0 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
30ae0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
30af0 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
30b00 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
30b10 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
30b20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
30b30 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
30b40 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66  [] */.  int iOvf
30b50 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20  lSpace = 0;     
30b60 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
30b70 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76  used byte of aOv
30b80 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69  flSpace[] */.  i
30b90 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
30ba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
30bb0 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
30bc0 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
30bd0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
30be0 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
30bf0 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
30c00 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
30c10 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
30c20 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  apCopy[NB];     
30c30 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63      /* Private c
30c40 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d  opies of apOld[]
30c50 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50   pages */.  MemP
30c60 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d  age *apNew[NB+2]
30c70 3b 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 4e 42 20 73  e and up to NB s
30c90 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61  iblings after ba
30ca0 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20  lancing */.  u8 
30cb0 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20  *pRight;        
30cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
30cd0 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20  ation in parent 
30ce0 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67  of right-sibling
30cf0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38   pointer */.  u8
30d00 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20   *apDiv[NB-1];  
30d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
30d20 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70  vider cells in p
30d30 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  Parent */.  int 
30d40 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  cntNew[NB+2];   
30d50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
30d60 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20  x in aCell[] of 
30d70 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20  cell after i-th 
30d80 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  page */.  int sz
30d90 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
30da0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e         /* Combin
30db0 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73  ed size of cells
30dc0 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70   place on i-th p
30dd0 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
30de0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
30df0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
30e00 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65  ls begin balance
30e10 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65  d */.  u16 *szCe
30e20 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
30e30 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a      /* Local siz
30e40 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69  e of all cells i
30e50 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
30e60 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
30e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e80 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73  Space for copies
30e90 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c   of dividers cel
30ea0 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ls */.  Pgno pgn
30eb0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
30ec0 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72       /* Temp var
30ed0 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65   to store a page
30ee0 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20   number in */.. 
30ef0 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e   pBt = pParent->
30f00 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
30f10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
30f20 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
30f30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
30f40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
30f50 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
30f60 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20  age) );..#if 0. 
30f70 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
30f80 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20  : begin page %d 
30f90 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20  child of %d\n", 
30fa0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61  pPage->pgno, pPa
30fb0 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65  rent->pgno));.#e
30fc0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ndif..  /* At th
30fd0 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74  is point pParent
30fe0 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73   may have at mos
30ff0 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63  t one overflow c
31000 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a  ell. And if.  **
31010 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63   this overflow c
31020 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20  ell is present, 
31030 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  it must be the c
31040 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69  ell with .  ** i
31050 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e  ndex iParentIdx.
31060 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63   This scenario c
31070 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20  omes about when 
31080 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
31090 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e  ** is called (in
310a0 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73  directly) from s
310b0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
310c0 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  e()..  */.  asse
310d0 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  rt( pParent->nOv
310e0 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61  erflow==0 || pPa
310f0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
31100 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
31110 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
31120 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
31130 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
31140 69 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20  iParentIdx );.. 
31150 20 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65   if( !aOvflSpace
31160 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
31170 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
31180 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
31190 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
311a0 20 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c   balance. Also l
311b0 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ocate the cells 
311c0 69 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a  in pParent .  **
311d0 20 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65   that divide the
311e0 20 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74   siblings. An at
311f0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
31200 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67   find NN sibling
31210 73 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65  s on .  ** eithe
31220 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e  r side of pPage.
31230 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61   More siblings a
31240 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e  re taken from on
31250 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c  e side, however,
31260 20 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20   .  ** if there 
31270 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
31280 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
31290 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66  e other side. If
312a0 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61   pParent.  ** ha
312b0 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68  s NB or fewer ch
312c0 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20  ildren then all 
312d0 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72  children of pPar
312e0 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20  ent are taken.  
312f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20  .  **.  ** This 
31300 6c 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20  loop also drops 
31310 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c  the divider cell
31320 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e  s from the paren
31330 74 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a  t page. This.  *
31340 2a 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69  * way, the remai
31350 6e 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63  nder of the func
31360 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61  tion does not ha
31370 76 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  ve to deal with 
31380 61 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  any.  ** overflo
31390 77 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  w cells in the p
313a0 61 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63  arent page, sinc
313b0 65 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64  e if any existed
313c0 20 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20   they will.  ** 
313d0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
313e0 6e 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a  n removed..  */.
313f0 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e    i = pParent->n
31400 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65  Overflow + pPare
31410 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  nt->nCell;.  if(
31420 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69   i<2 ){.    nxDi
31430 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20  v = 0;.    nOld 
31440 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = i+1;.  }else{.
31450 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20      nOld = 3;.  
31460 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78    if( iParentIdx
31470 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
31480 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78         .      nx
31490 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Div = 0;.    }el
314a0 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64  se if( iParentId
314b0 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78  x==i ){.      nx
314c0 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d  Div = i-2;.    }
314d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69  else{.      nxDi
314e0 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31  v = iParentIdx-1
314f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
31500 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b  2;.  }.  if( (i+
31510 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
31520 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
31530 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
31540 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
31550 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
31560 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
31570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
31580 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
31590 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
315a0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
315b0 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
315c0 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
315d0 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
315e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
315f0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
31600 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  pgno, &apOld[i])
31610 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
31620 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
31630 6c 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a  ld, 0, (i+1)*siz
31640 65 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a  eof(MemPage*));.
31650 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
31660 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
31670 7d 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20  }.    nMaxCells 
31680 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  += 1+apOld[i]->n
31690 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e  Cell+apOld[i]->n
316a0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66  Overflow;.    if
316b0 28 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65  ( (i--)==0 ) bre
316c0 61 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e  ak;..    if( i+n
316d0 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
316e0 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70  Ovfl[0].idx && p
316f0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31700 77 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76  w ){.      apDiv
31710 5b 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61  [i] = pParent->a
31720 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
31730 20 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34       pgno = get4
31740 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
31750 20 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d        szNew[i] =
31760 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
31770 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b  rent, apDiv[i]);
31780 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e  .      pParent->
31790 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
317a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
317b0 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43  apDiv[i] = findC
317c0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e  ell(pParent, i+n
317d0 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
317e0 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
317f0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
31800 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
31810 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c   szNew[i] = cell
31820 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
31830 20 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20   apDiv[i]);..   
31840 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63     /* Drop the c
31850 65 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72  ell from the par
31860 65 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b  ent page. apDiv[
31870 69 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20  i] still points 
31880 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
31890 63 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20  cell within the 
318a0 70 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f  parent, even tho
318b0 75 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20  ugh it has been 
318c0 64 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a  dropped..      *
318d0 2a 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  * This is safe b
318e0 65 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20  ecause dropping 
318f0 61 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72  a cell only over
31900 77 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74  writes the first
31910 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62  .      ** four b
31920 79 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20  ytes of it, and 
31930 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
31940 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20  es not need the 
31950 66 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66  first.      ** f
31960 6f 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65  our bytes of the
31970 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53   divider cell. S
31980 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73  o the pointer is
31990 20 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20   safe to use.   
319a0 20 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20     ** later on. 
319b0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
319c0 20 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74   ** Unless SQLit
319d0 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e  e is compiled in
319e0 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
319f0 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
31a00 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
31a10 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69  dropCell() routi
31a20 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  ne will overwrit
31a30 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  e the entire cel
31a40 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20  l with zeroes.. 
31a50 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
31a60 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c  case, temporaril
31a70 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20  y copy the cell 
31a80 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70  into the aOvflSp
31a90 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62  ace[].      ** b
31aa0 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62  uffer. It will b
31ab0 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61  e copied out aga
31ac0 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  in as soon as th
31ad0 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65  e aSpace[] buffe
31ae0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  r.      ** is al
31af0 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  located.  */.   
31b00 20 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75     if( pBt->secu
31b10 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
31b20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 53      int iOff = S
31b30 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
31b40 28 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c  (apDiv[i]) - SQL
31b50 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
31b60 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a  Parent->aData);.
31b70 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66          if( (iOf
31b80 66 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74  f+szNew[i])>(int
31b90 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31bb0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31bc0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
31bd0 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20    memset(apOld, 
31be0 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28  0, (i+1)*sizeof(
31bf0 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
31c00 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
31c10 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
31c20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31c30 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76       memcpy(&aOv
31c40 66 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61  flSpace[iOff], a
31c50 70 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69  pDiv[i], szNew[i
31c60 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  ]);.          ap
31c70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53  Div[i] = &aOvflS
31c80 70 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50  pace[apDiv[i]-pP
31c90 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20  arent->aData];. 
31ca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
31cb0 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
31cc0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
31cd0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
31ce0 6c 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26  low, szNew[i], &
31cf0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
31d00 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65    /* Make nMaxCe
31d10 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  lls a multiple o
31d20 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  f 4 in order to 
31d30 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a  preserve 8-byte.
31d40 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a    ** alignment *
31d50 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  /.  nMaxCells = 
31d60 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26  (nMaxCells + 3)&
31d70 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41  ~3;..  /*.  ** A
31d80 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
31d90 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  r memory structu
31da0 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70  res.  */.  k = p
31db0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52  Bt->pageSize + R
31dc0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
31dd0 50 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61  Page));.  szScra
31de0 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61  tch =.       nMa
31df0 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38  xCells*sizeof(u8
31e00 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
31e10 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65           /* apCe
31e20 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61  ll */.     + nMa
31e30 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31  xCells*sizeof(u1
31e40 36 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  6)              
31e50 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65           /* szCe
31e60 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74  ll */.     + pBt
31e70 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20  ->pageSize      
31e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e90 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61           /* aSpa
31ea0 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a  ce1 */.     + k*
31eb0 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  nOld;           
31ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
31ee0 65 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79  e copies (apCopy
31ef0 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20  ) */.  apCell = 
31f00 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
31f10 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20  lloc( szScratch 
31f20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c  ); .  if( apCell
31f30 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
31f40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
31f50 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
31f60 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a  leanup;.  }.  sz
31f70 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
31f80 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b  Cell[nMaxCells];
31f90 0a 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38  .  aSpace1 = (u8
31fa0 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
31fb0 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
31fc0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
31fd0 4d 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b  MENT(aSpace1) );
31fe0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64  ..  /*.  ** Load
31ff0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
32000 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e   cells on siblin
32010 67 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20  g pages and the 
32020 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20  divider cells.  
32030 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ** into the loca
32040 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79  l apCell[] array
32050 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f  .  Make copies o
32060 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
32070 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70  lls.  ** into sp
32080 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
32090 6d 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20  m aSpace1[] and 
320a0 72 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64  remove the the d
320b0 69 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a  ivider Cells.  *
320c0 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a  * from pParent..
320d0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
320e0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e   siblings are on
320f0 20 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65   leaf pages, the
32100 6e 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e  n the child poin
32110 74 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a  ters of the.  **
32120 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61   divider cells a
32130 72 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d  re stripped from
32140 20 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72   the cells befor
32150 65 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65  e they are copie
32160 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61  d.  ** into aSpa
32170 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20  ce1[].  In this 
32180 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
32190 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77  n apCell[] are w
321a0 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c  ithout.  ** chil
321b0 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20  d pointers.  If 
321c0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
321d0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c   leaves, then al
321e0 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61  l cell in.  ** a
321f0 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20  pCell[] include 
32200 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20  child pointers. 
32210 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c   Either way, all
32220 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
32230 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b  [].  ** are alik
32240 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61  e..  **.  ** lea
32250 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20  fCorrection:  4 
32260 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
32270 61 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20  af.  0 if pPage 
32280 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20  is not a leaf.. 
32290 20 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61   **       leafDa
322a0 74 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20  ta:  1 if pPage 
322b0 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61  holds key+data a
322c0 6e 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73  nd pParent holds
322d0 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f   only keys..  */
322e0 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
322f0 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65  n = apOld[0]->le
32300 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
32310 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73   = apOld[0]->has
32320 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Data;.  for(i=0;
32330 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
32340 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20     int limit;.  
32350 20 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65    .    /* Before
32360 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
32370 65 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70  else, take a cop
32380 79 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72  y of the i'th or
32390 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20  iginal sibling. 
323a0 20 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f     ** The rest o
323b0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
323c0 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
323d0 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
323e0 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74  ther.    ** that
323f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
32400 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72  ges since the or
32410 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c  iginal pages wil
32420 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20  l be in the.    
32430 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  ** process of be
32440 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  ing overwritten.
32450 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65    */.    MemPage
32460 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
32470 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26  i] = (MemPage*)&
32480 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67  aSpace1[pBt->pag
32490 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20  eSize + k*i];.  
324a0 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61    memcpy(pOld, a
324b0 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28  pOld[i], sizeof(
324c0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70  MemPage));.    p
324d0 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f  Old->aData = (vo
324e0 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20  id*)&pOld[1];.  
324f0 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61    memcpy(pOld->a
32500 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e  Data, apOld[i]->
32510 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65  aData, pBt->page
32520 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69  Size);..    limi
32530 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
32540 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
32550 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e  .    if( pOld->n
32560 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20  Overflow>0 ){.  
32570 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
32580 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  imit; j++){.    
32590 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
325a0 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
325b0 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43         apCell[nC
325c0 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
325d0 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
325e0 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
325f0 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
32600 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
32610 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
32620 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
32630 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
32640 20 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 20        u8 *aData 
32650 3d 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20  = pOld->aData;. 
32660 20 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67       u16 maskPag
32670 65 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61  e = pOld->maskPa
32680 67 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65  ge;.      u16 ce
32690 6c 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d  llOffset = pOld-
326a0 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
326b0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
326c0 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
326d0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
326e0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
326f0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
32700 6c 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32  ll] = findCellv2
32710 28 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65  (aData, maskPage
32720 2c 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29  , cellOffset, j)
32730 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c  ;.        szCell
32740 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
32750 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
32760 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
32770 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
32780 20 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20     }.    }      
32790 20 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64   .    if( i<nOld
327a0 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29  -1 && !leafData)
327b0 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
327c0 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a   (u16)szNew[i];.
327d0 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
327e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
327f0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
32800 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
32810 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20  Cell] = sz;.    
32820 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
32830 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20  e1[iSpace1];.   
32840 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a     iSpace1 += sz
32850 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
32860 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  sz<=pBt->maxLoca
32870 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73  l+23 );.      as
32880 73 65 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d  sert( iSpace1 <=
32890 20 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53   (int)pBt->pageS
328a0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  ize );.      mem
328b0 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
328c0 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
328d0 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  apCell[nCell] = 
328e0 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63  pTemp+leafCorrec
328f0 74 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65  tion;.      asse
32900 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
32910 6f 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72  on==0 || leafCor
32920 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20  rection==4 );.  
32930 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
32940 5d 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c  ] = szCell[nCell
32950 5d 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] - leafCorrecti
32960 6f 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  on;.      if( !p
32970 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
32980 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
32990 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
329a0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
329b0 28 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65  ( pOld->hdrOffse
329c0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
329d0 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69  /* The right poi
329e0 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
329f0 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f  d page pOld beco
32a00 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20  mes the left.   
32a10 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
32a20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
32a30 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ell */.        m
32a40 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65  emcpy(apCell[nCe
32a50 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74  ll], &pOld->aDat
32a60 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[8], 4);.      
32a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
32a80 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
32a90 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  ction==4 );.    
32aa0 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e      if( szCell[n
32ab0 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20  Cell]<4 ){.     
32ac0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61       /* Do not a
32ad0 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73  llow any cells s
32ae0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79  maller than 4 by
32af0 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tes. */.        
32b00 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
32b10 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 4;.        }. 
32b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65       }.      nCe
32b30 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ll++;.    }.  }.
32b40 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72  .  /*.  ** Figur
32b50 65 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72  e out the number
32b60 20 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64   of pages needed
32b70 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65   to hold all nCe
32b80 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53  ll cells..  ** S
32b90 74 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72  tore this number
32ba0 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63   in "k".  Also c
32bb0 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77  ompute szNew[] w
32bc0 68 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61  hich is the tota
32bd0 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61  l.  ** size of a
32be0 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  ll cells on the 
32bf0 69 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e  i-th page and cn
32c00 74 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  tNew[] which is 
32c10 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69  the index.  ** i
32c20 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68  n apCell[] of th
32c30 65 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69  e cell that divi
32c40 64 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20  des page i from 
32c50 70 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a  page i+1.  .  **
32c60 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c   cntNew[k] shoul
32c70 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20  d equal nCell.. 
32c80 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20   **.  ** Values 
32c90 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73  computed by this
32ca0 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a   block:.  **.  *
32cb0 2a 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54  *           k: T
32cc0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
32cd0 6f 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  of sibling pages
32ce0 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69  .  **    szNew[i
32cf0 5d 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f  ]: Spaced used o
32d00 6e 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  n the i-th sibli
32d10 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20  ng page..  **   
32d20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78  cntNew[i]: Index
32d30 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64   in apCell[] and
32d40 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68   szCell[] for th
32d50 65 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a  e first cell to.
32d60 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
32d70 20 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74    the right of t
32d80 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20  he i-th sibling 
32d90 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c  page..  ** usabl
32da0 65 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f  eSpace: Number o
32db0 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
32dc0 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61   available on ea
32dd0 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a  ch sibling..  **
32de0 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53   .  */.  usableS
32df0 70 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  pace = pBt->usab
32e00 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65  leSize - 12 + le
32e10 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
32e20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69  for(subtotal=k=i
32e30 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
32e40 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ){.    assert( i
32e50 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
32e60 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a    subtotal += sz
32e70 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20  Cell[i] + 2;.   
32e80 20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20   if( subtotal > 
32e90 75 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20  usableSpace ){. 
32ea0 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20       szNew[k] = 
32eb0 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c  subtotal - szCel
32ec0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e  l[i];.      cntN
32ed0 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20  ew[k] = i;.     
32ee0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
32ef0 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75   i--; }.      su
32f00 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20  btotal = 0;.    
32f10 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    k++;.      if(
32f20 20 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20   k>NB+1 ){ rc = 
32f30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
32f40 4b 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63  KPT; goto balanc
32f50 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20  e_cleanup; }.   
32f60 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
32f70 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
32f80 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
32f90 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
32fa0 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
32fb0 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
32fc0 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
32fd0 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
32fe0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
32ff0 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
33000 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
33010 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
33020 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
33030 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
33040 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
33050 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
33060 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
33070 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
33080 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
33090 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
330a0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
330b0 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
330c0 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
330d0 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
330e0 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
330f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
33100 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
33110 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
33120 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
33130 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
33140 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
33150 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
33160 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
33170 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
33180 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
33190 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
331a0 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
331b0 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
331c0 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
331d0 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
331e0 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
331f0 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
33200 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
33210 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
33220 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
33230 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
33240 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
33250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33260 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
33270 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
33280 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
33290 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
332a0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
332b0 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
332c0 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
332d0 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
332e0 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
332f0 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
33300 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
33310 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
33320 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
33330 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
33340 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
33350 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
33360 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
33370 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
33380 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
33390 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
333a0 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
333b0 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
333c0 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
333d0 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
333e0 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
333f0 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
33400 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
33410 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
33420 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
33430 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
33440 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
33450 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
33460 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
33470 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
33480 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
33490 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
334a0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
334b0 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
334c0 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
334d0 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
334e0 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
334f0 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
33500 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
33510 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
33520 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
33530 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
33540 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
33550 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
33560 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
33570 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
33580 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30    ",.    apOld[0
33590 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f  ]->pgno, .    nO
335a0 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d  ld>=2 ? apOld[1]
335b0 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20  ->pgno : 0,.    
335c0 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b  nOld>=3 ? apOld[
335d0 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29  2]->pgno : 0.  )
335e0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  );..  /*.  ** Al
335f0 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67  locate k new pag
33600 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70  es.  Reuse old p
33610 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69  ages where possi
33620 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
33630 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d  apOld[0]->pgno<=
33640 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
33650 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33660 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  T;.    goto bala
33670 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
33680 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61  .  pageFlags = a
33690 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30  pOld[0]->aData[0
336a0 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
336b0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
336c0 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
336d0 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
336e0 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
336f0 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
33700 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
33710 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
33720 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33730 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b  (pNew->pDbPage);
33740 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20  .      nNew++;. 
33750 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
33760 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
33770 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
33780 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
33790 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
337a0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
337b0 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
337c0 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  no, pgno, 0);.  
337d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
337e0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
337f0 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
33800 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
33810 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  nNew++;..      /
33820 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
33830 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
33840 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
33850 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  page. */.      i
33860 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
33870 29 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  ){.        ptrma
33880 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
33890 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
338a0 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
338b0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  o, &rc);.       
338c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
338d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
338e0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
338f0 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
33900 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
33910 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
33920 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
33930 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
33940 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
33950 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
33960 6c 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61  ld ){.    freePa
33970 67 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63  ge(apOld[i], &rc
33980 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33990 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
339a0 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
339b0 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
339c0 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
339d0 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
339e0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
339f0 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
33a00 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
33a10 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
33a20 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
33a30 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
33a40 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
33a50 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
33a60 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
33a70 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
33a80 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
33a90 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
33aa0 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
33ab0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
33ac0 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
33ad0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
33ae0 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
33af0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
33b00 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
33b10 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
33b20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
33b30 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
33b40 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
33b50 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
33b60 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
33b70 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
33b80 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
33b90 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
33ba0 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
33bb0 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
33bc0 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
33bd0 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
33be0 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
33bf0 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
33c00 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
33c10 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
33c20 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69  t minV = apNew[i
33c30 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74  ]->pgno;.    int
33c40 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
33c50 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
33c60 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
33c70 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75  pNew[j]->pgno<(u
33c80 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
33c90 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
33ca0 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
33cb0 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b   apNew[j]->pgno;
33cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
33cd0 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
33ce0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
33cf0 70 54 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  pT;.      pT = a
33d00 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61  pNew[i];.      a
33d10 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b  pNew[i] = apNew[
33d20 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e  minI];.      apN
33d30 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20  ew[minI] = pT;. 
33d40 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45     }.  }.  TRACE
33d50 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25  (("new: %d(%d) %
33d60 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
33d70 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  %d) %d(%d)\n",. 
33d80 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e     apNew[0]->pgn
33d90 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  o, szNew[0],.   
33da0 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77   nNew>=2 ? apNew
33db0 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [1]->pgno : 0, n
33dc0 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
33dd0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
33de0 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70  =3 ? apNew[2]->p
33df0 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33  gno : 0, nNew>=3
33e00 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c   ? szNew[2] : 0,
33e10 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61  .    nNew>=4 ? a
33e20 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[3]->pgno : 
33e30 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
33e40 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
33e50 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34  New>=5 ? apNew[4
33e60 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
33e70 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
33e80 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  : 0));..  assert
33e90 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
33ea0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
33eb0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
33ec0 20 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74   put4byte(pRight
33ed0 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  , apNew[nNew-1]-
33ee0 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20  >pgno);..  /*.  
33ef0 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69  ** Evenly distri
33f00 62 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  bute the data in
33f10 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73   apCell[] across
33f20 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a   the new pages..
33f30 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69    ** Insert divi
33f40 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70  der cells into p
33f50 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73  Parent as necess
33f60 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20  ary..  */.  j = 
33f70 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
33f80 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
33f90 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20  /* Assemble the 
33fa0 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65  new sibling page
33fb0 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65  . */.    MemPage
33fc0 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69   *pNew = apNew[i
33fd0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  ];.    assert( j
33fe0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
33ff0 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c    zeroPage(pNew,
34000 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20   pageFlags);.   
34010 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
34020 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c  ew, cntNew[i]-j,
34030 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a   &apCell[j], &sz
34040 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73  Cell[j]);.    as
34050 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c  sert( pNew->nCel
34060 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20  l>0 || (nNew==1 
34070 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29  && cntNew[0]==0)
34080 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
34090 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  pNew->nOverflow=
340a0 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63  =0 );..    j = c
340b0 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
340c0 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
340d0 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
340e0 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
340f0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
34100 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
34110 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
34120 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
34130 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
34140 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e      assert( i<nN
34150 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c  ew-1 || j==nCell
34160 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43   );.    if( j<nC
34170 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20  ell ){.      u8 
34180 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38  *pCell;.      u8
34190 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69   *pTemp;.      i
341a0 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73  nt sz;..      as
341b0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
341c0 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  s );.      pCell
341d0 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20   = apCell[j];.  
341e0 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b      sz = szCell[
341f0 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  j] + leafCorrect
34200 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70  ion;.      pTemp
34210 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69   = &aOvflSpace[i
34220 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20  OvflSpace];.    
34230 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
34240 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
34250 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
34260 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
34270 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34280 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
34290 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
342a0 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
342b0 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
342c0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
342d0 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
342e0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
342f0 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
34300 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
34310 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
34320 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
34330 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
34340 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
34350 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
34360 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
34370 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
34380 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
34390 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
343a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
343b0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
343c0 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
343d0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
343e0 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
343f0 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
34400 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
34410 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20  emp;.        sz 
34420 3d 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28  = 4 + putVarint(
34430 26 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e  &pCell[4], info.
34440 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70  nKey);.        p
34450 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Temp = 0;.      
34460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
34470 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20  Cell -= 4;.     
34480 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61     /* Obscure ca
34490 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d  se for non-leaf-
344a0 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74  data trees: If t
344b0 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c  he cell at pCell
344c0 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   was.        ** 
344d0 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65  previously store
344e0 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65  d on a leaf node
344f0 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74  , and its report
34500 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20  ed size was 4.  
34510 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20        ** bytes, 
34520 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75  then it may actu
34530 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20  ally be smaller 
34540 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20  than this .     
34550 20 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65     ** (see btree
34560 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
34570 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
34580 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
34590 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
345a0 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
345b0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
345c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
345d0 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
345e0 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
345f0 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
34600 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
34610 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
34620 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
34630 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
34640 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
34650 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
34660 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
34670 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
34680 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
34690 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
346a0 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
346b0 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
346c0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
346d0 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
346e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
346f0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
34700 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
34710 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
34720 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
34730 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
34740 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
34750 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
34760 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34770 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20    iOvflSpace += 
34780 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
34790 28 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f  ( sz<=pBt->maxLo
347a0 63 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20  cal+23 );.      
347b0 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61  assert( iOvflSpa
347c0 63 65 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  ce <= (int)pBt->
347d0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
347e0 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61    insertCell(pPa
347f0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
34800 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70  ll, sz, pTemp, p
34810 4e 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b  New->pgno, &rc);
34820 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
34830 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
34840 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
34850 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
34860 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
34870 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
34880 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34890 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78     j++;.      nx
348a0 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Div++;.    }.  }
348b0 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43  .  assert( j==nC
348c0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
348d0 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73   nOld>0 );.  ass
348e0 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
348f0 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20   if( (pageFlags 
34900 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29  & PTF_LEAF)==0 )
34910 7b 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64  {.    u8 *zChild
34920 20 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d   = &apCopy[nOld-
34930 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20  1]->aData[8];.  
34940 20 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b    memcpy(&apNew[
34950 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nNew-1]->aData[8
34960 5d 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20  ], zChild, 4);. 
34970 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74   }..  if( isRoot
34980 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
34990 6c 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74  ll==0 && pParent
349a0 2d 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e  ->hdrOffset<=apN
349b0 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a  ew[0]->nFree ){.
349c0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
349d0 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
349e0 65 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  ee now contains 
349f0 6e 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e  no cells. The on
34a00 6c 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a  ly sibling.    *
34a10 2a 20 70 61 67 65 20 69 73 20 74 68 65 20 72 69  * page is the ri
34a20 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65  ght-child of the
34a30 20 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68   parent. Copy th
34a40 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
34a50 65 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70  e.    ** child p
34a60 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72  age into the par
34a70 65 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20  ent, decreasing 
34a80 74 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67  the overall heig
34a90 68 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ht of the.    **
34aa0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
34ab0 65 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69  e by one. This i
34ac0 73 20 64 65 73 63 72 69 62 65 64 20 61 73 20 74  s described as t
34ad0 68 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c  he "balance-shal
34ae0 6c 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75  lower".    ** su
34af0 62 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73  b-algorithm in s
34b00 6f 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  ome documentatio
34b10 6e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  n..    **.    **
34b20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
34b30 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
34b40 61 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f  ase, the call to
34b50 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
34b60 28 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20  () .    ** sets 
34b70 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
34b80 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
34b90 6e 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73  nding to databas
34ba0 65 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20  e image pages . 
34bb0 20 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20     ** for which 
34bc0 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73  the pointer is s
34bd0 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  tored within the
34be0 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63   content being c
34bf0 6f 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  opied..    **.  
34c00 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20    ** The second 
34c10 61 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72  assert below ver
34c20 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
34c30 68 69 6c 64 20 70 61 67 65 20 69 73 20 64 65 66  hild page is def
34c40 72 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a  ragmented.    **
34c50 20 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73   (it must be, as
34c60 20 69 74 20 77 61 73 20 6a 75 73 74 20 72 65 63   it was just rec
34c70 6f 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e 67  onstructed using
34c80 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29   assemblePage())
34c90 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
34ca0 20 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68   important if th
34cb0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 68 61  e parent page ha
34cc0 70 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65  ppens to be page
34cd0 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
34ce0 73 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e  se.    ** image.
34cf0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
34d00 20 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20   nNew==1 );.    
34d10 61 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d  assert( apNew[0]
34d20 2d 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20  ->nFree == .    
34d30 20 20 20 20 28 67 65 74 32 62 79 74 65 28 26 61      (get2byte(&a
34d40 70 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35  pNew[0]->aData[5
34d50 5d 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c  ])-apNew[0]->cel
34d60 6c 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d  lOffset-apNew[0]
34d70 2d 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20  ->nCell*2) .    
34d80 29 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43  );.    copyNodeC
34d90 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c  ontent(apNew[0],
34da0 20 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a   pParent, &rc);.
34db0 20 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4e      freePage(apN
34dc0 65 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d  ew[0], &rc);.  }
34dd0 65 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f 56  else if( ISAUTOV
34de0 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20  ACUUM ){.    /* 
34df0 46 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Fix the pointer-
34e00 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
34e10 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68  all the cells th
34e20 61 74 20 77 65 72 65 20 73 68 69 66 74 65 64 20  at were shifted 
34e30 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20  around. .    ** 
34e40 54 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61  There are severa
34e50 6c 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  l different type
34e60 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s of pointer-map
34e70 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65   entries that ne
34e80 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
34e90 64 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68  dealt with by th
34ea0 69 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65  is routine. Some
34eb0 20 6f 66 20 74 68 65 73 65 20 68 61 76 65 20 62   of these have b
34ec0 65 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c  een set already,
34ed0 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79   but.    ** many
34ee0 20 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66   have not. The f
34ef0 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75  ollowing is a su
34f00 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20  mmary:.    **.  
34f10 20 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e    **   1) The en
34f20 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
34f30 20 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e   with new siblin
34f40 67 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  g pages that wer
34f50 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20  e not.    **    
34f60 20 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20    siblings when 
34f70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
34f80 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20  s called. These 
34f90 68 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20  have already.   
34fa0 20 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65   **      been se
34fb0 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64  t. We don't need
34fc0 20 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20   to worry about 
34fd0 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61  old siblings tha
34fe0 74 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20  t were.    **   
34ff0 20 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20     moved to the 
35000 66 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20  free-list - the 
35010 66 72 65 65 50 61 67 65 28 29 20 63 6f 64 65 20  freePage() code 
35020 68 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20  has taken care. 
35030 20 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68     **      of th
35040 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ose..    **.    
35050 2a 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e  **   2) The poin
35060 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
35070 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35080 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
35090 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70  ow.    **      p
350a0 61 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66  age in any overf
350b0 6c 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64 20  low chains used 
350c0 62 79 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  by new divider c
350d0 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20  ells. These .   
350e0 20 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c   **      have al
350f0 73 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  so already been 
35100 74 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79  taken care of by
35110 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28   the insertCell(
35120 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20  ) code..    **. 
35130 20 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68     **   3) If th
35140 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
35150 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
35160 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
35170 61 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20  ages of.    **  
35180 20 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64      cells stored
35190 20 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20   on the sibling 
351a0 70 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74  pages may need t
351b0 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
351c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29    **.    **   4)
351d0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
351e0 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e  pages are not in
351f0 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f  ternal intkey no
35200 64 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20  des, then any.  
35210 20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66 6c    **      overfl
35220 6f 77 20 70 61 67 65 73 20 75 73 65 64 20 62 79  ow pages used by
35230 20 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61 79   these cells may
35240 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
35250 74 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ted.    **      
35260 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79  (internal intkey
35270 20 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f 6e   nodes never con
35280 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
35290 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
352a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
352b0 20 20 35 29 20 49 66 20 74 68 65 20 73 69 62 6c    5) If the sibl
352c0 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f  ing pages are no
352d0 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74  t leaves, then t
352e0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
352f0 20 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72 69     **      entri
35300 65 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  es for the right
35310 2d 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 20  -child pages of 
35320 65 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61 79  each sibling may
35330 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20 20   need.    **    
35340 20 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e    to be updated.
35350 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
35360 61 73 65 73 20 31 20 61 6e 64 20 32 20 61 72 65  ases 1 and 2 are
35370 20 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f 76   dealt with abov
35380 65 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 2e  e by other code.
35390 20 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   The next.    **
353a0 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74   block deals wit
353b0 68 20 63 61 73 65 73 20 33 20 61 6e 64 20 34 20  h cases 3 and 4 
353c0 61 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74 65  and the one afte
353d0 72 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e 20  r that, case 5. 
353e0 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65 74  Since.    ** set
353f0 74 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d  ting a pointer m
35400 61 70 20 65 6e 74 72 79 20 69 73 20 61 20 72 65  ap entry is a re
35410 6c 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69  latively expensi
35420 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68  ve operation, th
35430 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f  is.    ** code o
35440 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72  nly sets pointer
35450 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
35460 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c   child or overfl
35470 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 68 61  ow pages that ha
35480 76 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  ve.    ** actual
35490 6c 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e  ly moved between
354a0 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20   pages.  */.    
354b0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
354c0 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65  apNew[0];.    Me
354d0 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
354e0 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74  Copy[0];.    int
354f0 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c   nOverflow = pOl
35500 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
35510 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d    int iNextOld =
35520 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e   pOld->nCell + n
35530 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e  Overflow;.    in
35540 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e  t iOverflow = (n
35550 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d  Overflow ? pOld-
35560 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20  >aOvfl[0].idx : 
35570 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20  -1);.    j = 0; 
35580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
355a0 75 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62  urrent 'old' sib
355b0 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20  ling page */.   
355c0 20 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   k = 0;         
355d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
355e0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27      /* Current '
355f0 6e 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67  new' sibling pag
35600 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
35610 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
35620 0a 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76  .      int isDiv
35630 69 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ider = 0;.      
35640 77 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f  while( i==iNextO
35650 6c 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ld ){.        /*
35660 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
35670 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
35680 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
35690 73 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20  st cell on old. 
356a0 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
356b0 67 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65  g page j. If the
356c0 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
356d0 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
356e0 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
356f0 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
35700 6e 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64  n cell i was a d
35710 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a  ivider cell. */.
35720 20 20 20 20 20 20 20 20 70 4f 6c 64 20 3d 20 61          pOld = a
35730 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a 20 20 20 20  pCopy[++j];.    
35740 20 20 20 20 69 4e 65 78 74 4f 6c 64 20 3d 20 69      iNextOld = i
35750 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70   + !leafData + p
35760 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 70 4f 6c  Old->nCell + pOl
35770 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
35780 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e        if( pOld->
35790 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
357a0 20 20 20 20 20 20 20 6e 4f 76 65 72 66 6c 6f 77         nOverflow
357b0 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
357c0 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ow;.          iO
357d0 76 65 72 66 6c 6f 77 20 3d 20 69 20 2b 20 21 6c  verflow = i + !l
357e0 65 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e  eafData + pOld->
357f0 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3b 0a 20 20  aOvfl[0].idx;.  
35800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35810 69 73 44 69 76 69 64 65 72 20 3d 20 21 6c 65 61  isDivider = !lea
35820 66 44 61 74 61 3b 20 20 0a 20 20 20 20 20 20 7d  fData;  .      }
35830 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e  ..      assert(n
35840 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 69 4f  Overflow>0 || iO
35850 76 65 72 66 6c 6f 77 3c 69 20 29 3b 0a 20 20 20  verflow<i );.   
35860 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
35870 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c 64 2d 3e 61  low<2 || pOld->a
35880 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 4f 6c  Ovfl[0].idx==pOl
35890 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 2d  d->aOvfl[1].idx-
358a0 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
358b0 28 6e 4f 76 65 72 66 6c 6f 77 3c 33 20 7c 7c 20  (nOverflow<3 || 
358c0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e 69  pOld->aOvfl[1].i
358d0 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  dx==pOld->aOvfl[
358e0 32 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20  2].idx-1);.     
358f0 20 69 66 28 20 69 3d 3d 69 4f 76 65 72 66 6c 6f   if( i==iOverflo
35900 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 44  w ){.        isD
35910 69 76 69 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  ivider = 1;.    
35920 20 20 20 20 69 66 28 20 28 2d 2d 6e 4f 76 65 72      if( (--nOver
35930 66 6c 6f 77 29 3e 30 20 29 7b 0a 20 20 20 20 20  flow)>0 ){.     
35940 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 2b 2b       iOverflow++
35950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35960 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
35970 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20 29 7b 0a 20  ==cntNew[k] ){. 
35980 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69         /* Cell i
35990 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d   is the cell imm
359a0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
359b0 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  ng the last cell
359c0 20 6f 6e 20 6e 65 77 0a 20 20 20 20 20 20 20 20   on new.        
359d0 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  ** sibling page 
359e0 6b 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  k. If the siblin
359f0 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20  gs are not leaf 
35a00 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20  pages of an.    
35a10 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d      ** intkey b-
35a20 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20  tree, then cell 
35a30 69 20 69 73 20 61 20 64 69 76 69 64 65 72 20 63  i is a divider c
35a40 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ell.  */.       
35a50 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 2b 2b   pNew = apNew[++
35a60 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
35a70 21 6c 65 61 66 44 61 74 61 20 29 20 63 6f 6e 74  !leafData ) cont
35a80 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
35a90 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4f      assert( j<nO
35aa0 6c 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ld );.      asse
35ab0 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b 0a 0a 20  rt( k<nNew );.. 
35ac0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63       /* If the c
35ad0 65 6c 6c 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ell was original
35ae0 6c 79 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  ly divider cell 
35af0 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e 6f 77 29  (and is not now)
35b00 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20   or.      ** an 
35b10 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 6f  overflow cell, o
35b20 72 20 69 66 20 74 68 65 20 63 65 6c 6c 20 77 61  r if the cell wa
35b30 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 64  s located on a d
35b40 69 66 66 65 72 65 6e 74 20 73 69 62 6c 69 6e 67  ifferent sibling
35b50 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 62  .      ** page b
35b60 65 66 6f 72 65 20 74 68 65 20 62 61 6c 61 6e 63  efore the balanc
35b70 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 70 6f  ing, then the po
35b80 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
35b90 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 20  s associated.   
35ba0 20 20 20 2a 2a 20 77 69 74 68 20 61 6e 79 20 63     ** with any c
35bb0 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f 77  hild or overflow
35bc0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
35bd0 65 20 75 70 64 61 74 65 64 2e 20 20 2a 2f 0a 20  e updated.  */. 
35be0 20 20 20 20 20 69 66 28 20 69 73 44 69 76 69 64       if( isDivid
35bf0 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70 67 6e 6f  er || pOld->pgno
35c00 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a  !=pNew->pgno ){.
35c10 20 20 20 20 20 20 20 20 69 66 28 20 21 6c 65 61          if( !lea
35c20 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20  fCorrection ){. 
35c30 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50           ptrmapP
35c40 75 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ut(pBt, get4byte
35c50 28 61 70 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52  (apCell[i]), PTR
35c60 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d  MAP_BTREE, pNew-
35c70 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
35c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
35c90 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e 70 4e 65  f( szCell[i]>pNe
35ca0 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20  w->minLocal ){. 
35cb0 20 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 50           ptrmapP
35cc0 75 74 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20  utOvflPtr(pNew, 
35cd0 61 70 43 65 6c 6c 5b 69 5d 2c 20 26 72 63 29 3b  apCell[i], &rc);
35ce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35cf0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
35d00 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ( !leafCorrectio
35d10 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  n ){.      for(i
35d20 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
35d30 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 6b 65  {.        u32 ke
35d40 79 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 70  y = get4byte(&ap
35d50 4e 65 77 5b 69 5d 2d 3e 61 44 61 74 61 5b 38 5d  New[i]->aData[8]
35d60 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
35d70 70 50 75 74 28 70 42 74 2c 20 6b 65 79 2c 20 50  pPut(pBt, key, P
35d80 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e  TRMAP_BTREE, apN
35d90 65 77 5b 69 5d 2d 3e 70 67 6e 6f 2c 20 26 72 63  ew[i]->pgno, &rc
35da0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
35db0 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 20 54  ..#if 0.    /* T
35dc0 68 65 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61  he ptrmapCheckPa
35dd0 67 65 73 28 29 20 63 6f 6e 74 61 69 6e 73 20 61  ges() contains a
35de0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
35df0 74 73 20 74 68 61 74 20 76 65 72 69 66 79 20 74  ts that verify t
35e00 68 61 74 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 70  hat.    ** all p
35e10 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 73  ointer map pages
35e20 20 61 72 65 20 73 65 74 20 63 6f 72 72 65 63 74   are set correct
35e30 6c 79 2e 20 54 68 69 73 20 69 73 20 68 65 6c 70  ly. This is help
35e40 66 75 6c 20 77 68 69 6c 65 20 0a 20 20 20 20 2a  ful while .    *
35e50 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 54 68 69  * debugging. Thi
35e60 73 20 69 73 20 75 73 75 61 6c 6c 79 20 64 69 73  s is usually dis
35e70 61 62 6c 65 64 20 62 65 63 61 75 73 65 20 61 20  abled because a 
35e80 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
35e90 20 6d 61 79 0a 20 20 20 20 2a 2a 20 63 61 75 73   may.    ** caus
35ea0 65 20 61 6e 20 61 73 73 65 72 74 28 29 20 73 74  e an assert() st
35eb0 61 74 65 6d 65 6e 74 20 74 6f 20 66 61 69 6c 2e  atement to fail.
35ec0 20 20 2a 2f 0a 20 20 20 20 70 74 72 6d 61 70 43    */.    ptrmapC
35ed0 68 65 63 6b 50 61 67 65 73 28 61 70 4e 65 77 2c  heckPages(apNew,
35ee0 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 74 72 6d   nNew);.    ptrm
35ef0 61 70 43 68 65 63 6b 50 61 67 65 73 28 26 70 50  apCheckPages(&pP
35f00 61 72 65 6e 74 2c 20 31 29 3b 0a 23 65 6e 64 69  arent, 1);.#endi
35f10 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  f.  }..  assert(
35f20 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
35f30 20 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41   );.  TRACE(("BA
35f40 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 3a  LANCE: finished:
35f50 20 6f 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63   old=%d new=%d c
35f60 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  ells=%d\n",.    
35f70 20 20 20 20 20 20 6e 4f 6c 64 2c 20 6e 4e 65 77        nOld, nNew
35f80 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a 20 20 2f 2a  , nCell));..  /*
35f90 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
35fa0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
35fb0 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
35fc0 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 53  anup:.  sqlite3S
35fd0 63 72 61 74 63 68 46 72 65 65 28 61 70 43 65 6c  cratchFree(apCel
35fe0 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  l);.  for(i=0; i
35ff0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
36000 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f   releasePage(apO
36010 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f  ld[i]);.  }.  fo
36020 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69  r(i=0; i<nNew; i
36030 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
36040 50 61 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a  Page(apNew[i]);.
36050 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
36060 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
36070 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
36080 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 6f 6f  led when the roo
36090 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
360a0 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 0a  ee structure is.
360b0 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 28 68 61 73  ** overfull (has
360c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
360d0 72 66 6c 6f 77 20 70 61 67 65 73 29 2e 0a 2a 2a  rflow pages)..**
360e0 0a 2a 2a 20 41 20 6e 65 77 20 63 68 69 6c 64 20  .** A new child 
360f0 70 61 67 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  page is allocate
36100 64 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  d and the conten
36110 74 73 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ts of the curren
36120 74 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 2c 20  t root.** page, 
36130 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c  including overfl
36140 6f 77 20 63 65 6c 6c 73 2c 20 61 72 65 20 63 6f  ow cells, are co
36150 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20 63 68  pied into the ch
36160 69 6c 64 2e 20 54 68 65 20 72 6f 6f 74 0a 2a 2a  ild. The root.**
36170 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6f 76   page is then ov
36180 65 72 77 72 69 74 74 65 6e 20 74 6f 20 6d 61 6b  erwritten to mak
36190 65 20 69 74 20 61 6e 20 65 6d 70 74 79 20 70 61  e it an empty pa
361a0 67 65 20 77 69 74 68 20 74 68 65 20 72 69 67 68  ge with the righ
361b0 74 2d 63 68 69 6c 64 20 0a 2a 2a 20 70 6f 69 6e  t-child .** poin
361c0 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ter pointing to 
361d0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 0a 2a 2a  the new page..**
361e0 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
361f0 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f 69 6e 74 65  ning, all pointe
36200 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 63 6f  r-map entries co
36210 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
36220 61 67 65 73 20 0a 2a 2a 20 74 68 61 74 20 74 68  ages .** that th
36230 65 20 6e 65 77 20 63 68 69 6c 64 2d 70 61 67 65  e new child-page
36240 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 70 6f   now contains po
36250 69 6e 74 65 72 73 20 74 6f 20 61 72 65 20 75 70  inters to are up
36260 64 61 74 65 64 2e 20 54 68 65 0a 2a 2a 20 65 6e  dated. The.** en
36270 74 72 79 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  try correspondin
36280 67 20 74 6f 20 74 68 65 20 6e 65 77 20 72 69 67  g to the new rig
36290 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
362a0 20 6f 66 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20   of the root.** 
362b0 70 61 67 65 20 69 73 20 61 6c 73 6f 20 75 70 64  page is also upd
362c0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ated..**.** If s
362d0 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 70 43 68  uccessful, *ppCh
362e0 69 6c 64 20 69 73 20 73 65 74 20 74 6f 20 63 6f  ild is set to co
362f0 6e 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  ntain a referenc
36300 65 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 0a  e to the child .
36310 2a 2a 20 70 61 67 65 20 61 6e 64 20 53 51 4c 49  ** page and SQLI
36320 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
36330 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
36340 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
36350 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20 63 61 6c  quired.** to cal
36360 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 20  l releasePage() 
36370 6f 6e 20 2a 70 70 43 68 69 6c 64 20 65 78 61 63  on *ppChild exac
36380 74 6c 79 20 6f 6e 63 65 2e 20 49 66 20 61 6e 20  tly once. If an 
36390 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 0a 2a 2a  error occurs,.**
363a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
363b0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
363c0 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74  ppChild is set t
363d0 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  o 0..*/.static i
363e0 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nt balance_deepe
363f0 72 28 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74  r(MemPage *pRoot
36400 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 43 68  , MemPage **ppCh
36410 69 6c 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ild){.  int rc; 
36420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36430 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
36440 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70   value from subp
36450 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d  rocedures */.  M
36460 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 20 3d  emPage *pChild =
36470 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
36480 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65   Pointer to a ne
36490 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
364a0 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
364b0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
364c0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
364d0 6f 66 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  of the new child
364e0 20 70 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61   page */.  BtSha
364f0 72 65 64 20 2a 70 42 74 20 3d 20 70 52 6f 6f 74  red *pBt = pRoot
36500 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 54 68 65  ->pBt;    /* The
36510 20 42 54 72 65 65 20 2a 2f 0a 0a 20 20 61 73 73   BTree */..  ass
36520 65 72 74 28 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  ert( pRoot->nOve
36530 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 61 73 73  rflow>0 );.  ass
36540 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
36550 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
36560 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b  ex) );..  /* Mak
36570 65 20 70 52 6f 6f 74 2c 20 74 68 65 20 72 6f 6f  e pRoot, the roo
36580 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d  t page of the b-
36590 74 72 65 65 2c 20 77 72 69 74 61 62 6c 65 2e 20  tree, writable. 
365a0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 0a  Allocate a new .
365b0 20 20 2a 2a 20 70 61 67 65 20 74 68 61 74 20 77    ** page that w
365c0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
365d0 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  ew right-child o
365e0 66 20 70 50 61 67 65 2e 20 43 6f 70 79 20 74 68  f pPage. Copy th
365f0 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20  e contents.  ** 
36600 6f 66 20 74 68 65 20 6e 6f 64 65 20 73 74 6f 72  of the node stor
36610 65 64 20 6f 6e 20 70 52 6f 6f 74 20 69 6e 74 6f  ed on pRoot into
36620 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
36630 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  age..  */.  rc =
36640 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
36650 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  te(pRoot->pDbPag
36660 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
36670 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
36680 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
36690 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c  ePage(pBt,&pChil
366a0 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f  d,&pgnoChild,pRo
366b0 6f 74 2d 3e 70 67 6e 6f 2c 30 29 3b 0a 20 20 20  ot->pgno,0);.   
366c0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
366d0 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2c 20  (pRoot, pChild, 
366e0 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 49 53  &rc);.    if( IS
366f0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
36700 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
36710 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54  t, pgnoChild, PT
36720 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f  RMAP_BTREE, pRoo
36730 74 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  t->pgno, &rc);. 
36740 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
36750 63 20 29 7b 0a 20 20 20 20 2a 70 70 43 68 69 6c  c ){.    *ppChil
36760 64 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  d = 0;.    relea
36770 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
36780 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36790 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
367a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
367b0 61 62 6c 65 28 70 43 68 69 6c 64 2d 3e 70 44 62  able(pChild->pDb
367c0 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
367d0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
367e0 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74  swriteable(pRoot
367f0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
36800 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
36810 6e 43 65 6c 6c 3d 3d 70 52 6f 6f 74 2d 3e 6e 43  nCell==pRoot->nC
36820 65 6c 6c 20 29 3b 0a 0a 20 20 54 52 41 43 45 28  ell );..  TRACE(
36830 28 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20  ("BALANCE: copy 
36840 72 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c  root %d into %d\
36850 6e 22 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 2c  n", pRoot->pgno,
36860 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
36870 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20  ..  /* Copy the 
36880 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 66  overflow cells f
36890 72 6f 6d 20 70 52 6f 6f 74 20 74 6f 20 70 43 68  rom pRoot to pCh
368a0 69 6c 64 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ild */.  memcpy(
368b0 70 43 68 69 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70  pChild->aOvfl, p
368c0 52 6f 6f 74 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f  Root->aOvfl, pRo
368d0 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2a 73 69  ot->nOverflow*si
368e0 7a 65 6f 66 28 70 52 6f 6f 74 2d 3e 61 4f 76 66  zeof(pRoot->aOvf
368f0 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 68 69 6c 64  l[0]));.  pChild
36900 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 52  ->nOverflow = pR
36910 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  oot->nOverflow;.
36920 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 63  .  /* Zero the c
36930 6f 6e 74 65 6e 74 73 20 6f 66 20 70 52 6f 6f 74  ontents of pRoot
36940 2e 20 54 68 65 6e 20 69 6e 73 74 61 6c 6c 20 70  . Then install p
36950 43 68 69 6c 64 20 61 73 20 74 68 65 20 72 69 67  Child as the rig
36960 68 74 2d 63 68 69 6c 64 2e 20 2a 2f 0a 20 20 7a  ht-child. */.  z
36970 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 70  eroPage(pRoot, p
36980 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20  Child->aData[0] 
36990 26 20 7e 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  & ~PTF_LEAF);.  
369a0 70 75 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  put4byte(&pRoot-
369b0 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
369c0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
369d0 43 68 69 6c 64 29 3b 0a 0a 20 20 2a 70 70 43 68  Child);..  *ppCh
369e0 69 6c 64 20 3d 20 70 43 68 69 6c 64 3b 0a 20 20  ild = pChild;.  
369f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36a00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  ;.}../*.** The p
36a10 61 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75  age that pCur cu
36a20 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
36a30 6f 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  o has just been 
36a40 6d 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73  modified in.** s
36a50 6f 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75  ome way. This fu
36a60 6e 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f  nction figures o
36a70 75 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66  ut if this modif
36a80 69 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  ication means th
36a90 65 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20  e.** tree needs 
36aa0 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20  to be balanced, 
36ab0 61 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20  and if so calls 
36ac0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
36ad0 62 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f  balancing .** ro
36ae0 75 74 69 6e 65 2e 20 42 61 6c 61 6e 63 69 6e 67  utine. Balancing
36af0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 3a 0a 2a   routines are:.*
36b00 2a 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 71  *.**   balance_q
36b10 75 69 63 6b 28 29 0a 2a 2a 20 20 20 62 61 6c 61  uick().**   bala
36b20 6e 63 65 5f 64 65 65 70 65 72 28 29 0a 2a 2a 20  nce_deeper().** 
36b30 20 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f    balance_nonroo
36b40 74 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  t().*/.static in
36b50 74 20 62 61 6c 61 6e 63 65 28 42 74 43 75 72 73  t balance(BtCurs
36b60 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
36b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
36b80 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 4d 69  .  const int nMi
36b90 6e 20 3d 20 70 43 75 72 2d 3e 70 42 74 2d 3e 75  n = pCur->pBt->u
36ba0 73 61 62 6c 65 53 69 7a 65 20 2a 20 32 20 2f 20  sableSize * 2 / 
36bb0 33 3b 0a 20 20 75 38 20 61 42 61 6c 61 6e 63 65  3;.  u8 aBalance
36bc0 51 75 69 63 6b 53 70 61 63 65 5b 31 33 5d 3b 0a  QuickSpace[13];.
36bd0 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b    u8 *pFree = 0;
36be0 0a 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ..  TESTONLY( in
36bf0 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 5f  t balance_quick_
36c00 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b 0a 20 20  called = 0 );.  
36c10 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61  TESTONLY( int ba
36c20 6c 61 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c  lance_deeper_cal
36c30 6c 65 64 20 3d 20 30 20 29 3b 0a 0a 20 20 64 6f  led = 0 );..  do
36c40 20 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   {.    int iPage
36c50 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
36c60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
36c70 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
36c80 65 5b 69 50 61 67 65 5d 3b 0a 0a 20 20 20 20 69  e[iPage];..    i
36c90 66 28 20 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  f( iPage==0 ){. 
36ca0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
36cb0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
36cc0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74       /* The root
36cd0 20 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74   page of the b-t
36ce0 72 65 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  ree is overfull.
36cf0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 61   In this case ca
36d00 6c 6c 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ll the.        *
36d10 2a 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  * balance_deeper
36d20 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
36d30 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c  reate a new chil
36d40 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  d for the root-p
36d50 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  age.        ** a
36d60 6e 64 20 63 6f 70 79 20 74 68 65 20 63 75 72 72  nd copy the curr
36d70 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
36d80 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f  the root-page to
36d90 20 69 74 2e 20 54 68 65 0a 20 20 20 20 20 20 20   it. The.       
36da0 20 2a 2a 20 6e 65 78 74 20 69 74 65 72 61 74 69   ** next iterati
36db0 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
36dc0 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74  p will balance t
36dd0 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  he child page.. 
36de0 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
36df0 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c 61     assert( (bala
36e00 6e 63 65 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65  nce_deeper_calle
36e10 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  d++)==0 );.     
36e20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
36e30 64 65 65 70 65 72 28 70 50 61 67 65 2c 20 26 70  deeper(pPage, &p
36e40 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 29 3b  Cur->apPage[1]);
36e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
36e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36e70 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50          pCur->iP
36e80 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  age = 1;.       
36e90 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30     pCur->aiIdx[0
36ea0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
36eb0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 31 5d 20   pCur->aiIdx[1] 
36ec0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
36ed0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
36ee0 61 67 65 5b 31 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  age[1]->nOverflo
36ef0 77 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  w );.        }. 
36f00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36f10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
36f20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
36f30 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
36f40 77 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 6e  w==0 && pPage->n
36f50 46 72 65 65 3c 3d 6e 4d 69 6e 20 29 7b 0a 20 20  Free<=nMin ){.  
36f60 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
36f70 65 6c 73 65 7b 0a 20 20 20 20 20 20 4d 65 6d 50  else{.      MemP
36f80 61 67 65 20 2a 20 63 6f 6e 73 74 20 70 50 61 72  age * const pPar
36f90 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  ent = pCur->apPa
36fa0 67 65 5b 69 50 61 67 65 2d 31 5d 3b 0a 20 20 20  ge[iPage-1];.   
36fb0 20 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 49 64     int const iId
36fc0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
36fd0 69 50 61 67 65 2d 31 5d 3b 0a 0a 20 20 20 20 20  iPage-1];..     
36fe0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
36ff0 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d  erWrite(pParent-
37000 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
37010 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
37020 4f 4b 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  OK ){.#ifndef SQ
37030 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42  LITE_OMIT_QUICKB
37040 41 4c 41 4e 43 45 0a 20 20 20 20 20 20 20 20 69  ALANCE.        i
37050 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
37060 61 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  a.         && pP
37070 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
37080 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  1.         && pP
37090 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  age->aOvfl[0].id
370a0 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 0a  x==pPage->nCell.
370b0 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72           && pPar
370c0 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 0a 20 20 20  ent->pgno!=1.   
370d0 20 20 20 20 20 20 26 26 20 70 50 61 72 65 6e 74        && pParent
370e0 2d 3e 6e 43 65 6c 6c 3d 3d 69 49 64 78 0a 20 20  ->nCell==iIdx.  
370f0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
37100 20 20 20 2f 2a 20 43 61 6c 6c 20 62 61 6c 61 6e     /* Call balan
37110 63 65 5f 71 75 69 63 6b 28 29 20 74 6f 20 63 72  ce_quick() to cr
37120 65 61 74 65 20 61 20 6e 65 77 20 73 69 62 6c 69  eate a new sibli
37130 6e 67 20 6f 66 20 70 50 61 67 65 20 6f 6e 20 77  ng of pPage on w
37140 68 69 63 68 0a 20 20 20 20 20 20 20 20 20 20 2a  hich.          *
37150 2a 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6f  * to store the o
37160 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e 20 62 61  verflow cell. ba
37170 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 6e  lance_quick() in
37180 73 65 72 74 73 20 61 20 6e 65 77 20 63 65 6c 6c  serts a new cell
37190 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
371a0 74 6f 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63  to pParent, whic
371b0 68 20 6d 61 79 20 63 61 75 73 65 20 70 50 61 72  h may cause pPar
371c0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 2e 20 49 66  ent overflow. If
371d0 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
371e0 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20  ** happens, the 
371f0 6e 65 78 74 20 69 6e 74 65 72 61 74 69 6f 6e 20  next interation 
37200 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77  of the do-loop w
37210 69 6c 6c 20 62 61 6c 61 6e 63 65 20 70 50 61 72  ill balance pPar
37220 65 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ent .          *
37230 2a 20 75 73 65 20 65 69 74 68 65 72 20 62 61 6c  * use either bal
37240 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 6f  ance_nonroot() o
37250 72 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  r balance_deeper
37260 28 29 2e 20 55 6e 74 69 6c 20 74 68 69 73 0a 20  (). Until this. 
37270 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70           ** happ
37280 65 6e 73 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f  ens, the overflo
37290 77 20 63 65 6c 6c 20 69 73 20 73 74 6f 72 65 64  w cell is stored
372a0 20 69 6e 20 74 68 65 20 61 42 61 6c 61 6e 63 65   in the aBalance
372b0 51 75 69 63 6b 53 70 61 63 65 5b 5d 0a 20 20 20  QuickSpace[].   
372c0 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72         ** buffer
372d0 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  . .          **.
372e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65            ** The
372f0 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68 65 20   purpose of the 
37300 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
37310 28 29 20 69 73 20 74 6f 20 63 68 65 63 6b 20 74  () is to check t
37320 68 61 74 20 6f 6e 6c 79 20 61 0a 20 20 20 20 20  hat only a.     
37330 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 63       ** single c
37340 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 71  all to balance_q
37350 75 69 63 6b 28 29 20 69 73 20 6d 61 64 65 20 66  uick() is made f
37360 6f 72 20 65 61 63 68 20 63 61 6c 6c 20 74 6f 20  or each call to 
37370 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
37380 2a 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  * function. If t
37390 68 69 73 20 77 65 72 65 20 6e 6f 74 20 76 65 72  his were not ver
373a0 69 66 69 65 64 2c 20 61 20 73 75 62 74 6c 65 20  ified, a subtle 
373b0 62 75 67 20 69 6e 76 6f 6c 76 69 6e 67 20 72 65  bug involving re
373c0 75 73 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  use.          **
373d0 20 6f 66 20 74 68 65 20 61 42 61 6c 61 6e 63 65   of the aBalance
373e0 51 75 69 63 6b 53 70 61 63 65 5b 5d 20 6d 69 67  QuickSpace[] mig
373f0 68 74 20 73 6e 65 61 6b 20 69 6e 2e 0a 20 20 20  ht sneak in..   
37400 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
37410 20 20 20 20 61 73 73 65 72 74 28 20 28 62 61 6c      assert( (bal
37420 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65  ance_quick_calle
37430 64 2b 2b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  d++)==0 );.     
37440 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
37450 65 5f 71 75 69 63 6b 28 70 50 61 72 65 6e 74 2c  e_quick(pParent,
37460 20 70 50 61 67 65 2c 20 61 42 61 6c 61 6e 63 65   pPage, aBalance
37470 51 75 69 63 6b 53 70 61 63 65 29 3b 0a 20 20 20  QuickSpace);.   
37480 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
37490 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
374a0 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
374b0 20 63 61 73 65 2c 20 63 61 6c 6c 20 62 61 6c 61   case, call bala
374c0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 74 6f  nce_nonroot() to
374d0 20 72 65 64 69 73 74 72 69 62 75 74 65 20 63 65   redistribute ce
374e0 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  lls.          **
374f0 20 62 65 74 77 65 65 6e 20 70 50 61 67 65 20 61   between pPage a
37500 6e 64 20 75 70 20 74 6f 20 32 20 6f 66 20 69 74  nd up to 2 of it
37510 73 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 2e  s sibling pages.
37520 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 0a 20   This involves. 
37530 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 69           ** modi
37540 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
37550 74 73 20 6f 66 20 70 50 61 72 65 6e 74 2c 20 77  ts of pParent, w
37560 68 69 63 68 20 6d 61 79 20 63 61 75 73 65 20 70  hich may cause p
37570 50 61 72 65 6e 74 20 74 6f 0a 20 20 20 20 20 20  Parent to.      
37580 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 20 6f 76      ** become ov
37590 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
375a0 75 6c 6c 2e 20 54 68 65 20 6e 65 78 74 20 69 74  ull. The next it
375b0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
375c0 6f 2d 6c 6f 6f 70 0a 20 20 20 20 20 20 20 20 20  o-loop.         
375d0 20 2a 2a 20 77 69 6c 6c 20 62 61 6c 61 6e 63 65   ** will balance
375e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
375f0 20 74 6f 20 63 6f 72 72 65 63 74 20 74 68 69 73   to correct this
37600 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 0a  ..          ** .
37610 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
37620 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
37630 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75 6c 6c  becomes overfull
37640 2c 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  , the overflow c
37650 65 6c 6c 20 6f 72 20 63 65 6c 6c 73 0a 20 20 20  ell or cells.   
37660 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20 73 74         ** are st
37670 6f 72 65 64 20 69 6e 20 74 68 65 20 70 53 70 61  ored in the pSpa
37680 63 65 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61  ce buffer alloca
37690 74 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ted immediately 
376a0 62 65 6c 6f 77 2e 20 0a 20 20 20 20 20 20 20 20  below. .        
376b0 20 20 2a 2a 20 41 20 73 75 62 73 65 71 75 65 6e    ** A subsequen
376c0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
376d0 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
376e0 64 65 61 6c 20 77 69 74 68 20 74 68 69 73 20 62  deal with this b
376f0 79 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  y.          ** c
37700 61 6c 6c 69 6e 67 20 62 61 6c 61 6e 63 65 5f 6e  alling balance_n
37710 6f 6e 72 6f 6f 74 28 29 20 28 62 61 6c 61 6e 63  onroot() (balanc
37720 65 5f 64 65 65 70 65 72 28 29 20 6d 61 79 20 62  e_deeper() may b
37730 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 2c 0a  e called first,.
37740 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 74            ** but
37750 20 69 74 20 64 6f 65 73 6e 27 74 20 64 65 61 6c   it doesn't deal
37760 20 77 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 63   with overflow c
37770 65 6c 6c 73 20 2d 20 6a 75 73 74 20 6d 6f 76 65  ells - just move
37780 73 20 74 68 65 6d 20 74 6f 20 61 0a 20 20 20 20  s them to a.    
37790 20 20 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65        ** differe
377a0 6e 74 20 70 61 67 65 29 2e 20 4f 6e 63 65 20 74  nt page). Once t
377b0 68 69 73 20 73 75 62 73 65 71 75 65 6e 74 20 63  his subsequent c
377c0 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e  all to balance_n
377d0 6f 6e 72 6f 6f 74 28 29 20 0a 20 20 20 20 20 20  onroot() .      
377e0 20 20 20 20 2a 2a 20 68 61 73 20 63 6f 6d 70 6c      ** has compl
377f0 65 74 65 64 2c 20 69 74 20 69 73 20 73 61 66 65  eted, it is safe
37800 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65 20   to release the 
37810 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75 73  pSpace buffer us
37820 65 64 20 62 79 0a 20 20 20 20 20 20 20 20 20 20  ed by.          
37830 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  ** the previous 
37840 63 61 6c 6c 2c 20 61 73 20 74 68 65 20 6f 76 65  call, as the ove
37850 72 66 6c 6f 77 20 63 65 6c 6c 20 64 61 74 61 20  rflow cell data 
37860 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 0a  will have been .
37870 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70            ** cop
37880 69 65 64 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ied either into 
37890 74 68 65 20 62 6f 64 79 20 6f 66 20 61 20 64 61  the body of a da
378a0 74 61 62 61 73 65 20 70 61 67 65 20 6f 72 20 69  tabase page or i
378b0 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
378c0 20 20 20 20 20 20 2a 2a 20 70 53 70 61 63 65 20        ** pSpace 
378d0 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f  buffer passed to
378e0 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 6c 6c   the latter call
378f0 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
37900 6f 6f 74 28 29 2e 0a 20 20 20 20 20 20 20 20 20  oot()..         
37910 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 38   */.          u8
37920 20 2a 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74   *pSpace = sqlit
37930 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 43 75  e3PageMalloc(pCu
37940 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  r->pBt->pageSize
37950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
37960 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
37970 74 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 2c  t(pParent, iIdx,
37980 20 70 53 70 61 63 65 2c 20 69 50 61 67 65 3d 3d   pSpace, iPage==
37990 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
379a0 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20  ( pFree ){.     
379b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70 46 72         /* If pFr
379c0 65 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ee is not NULL, 
379d0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
379e0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 75   pSpace buffer u
379f0 73 65 64 20 0a 20 20 20 20 20 20 20 20 20 20 20  sed .           
37a00 20 2a 2a 20 62 79 20 61 20 70 72 65 76 69 6f 75   ** by a previou
37a10 73 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  s call to balanc
37a20 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 20 49 74 73  e_nonroot(). Its
37a30 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 0a 20 20   contents are.  
37a40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 77            ** now
37a50 20 73 74 6f 72 65 64 20 65 69 74 68 65 72 20 6f   stored either o
37a60 6e 20 72 65 61 6c 20 64 61 74 61 62 61 73 65 20  n real database 
37a70 70 61 67 65 73 20 6f 72 20 77 69 74 68 69 6e 20  pages or within 
37a80 74 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  the .           
37a90 20 2a 2a 20 6e 65 77 20 70 53 70 61 63 65 20 62   ** new pSpace b
37aa0 75 66 66 65 72 2c 20 73 6f 20 69 74 20 6d 61 79  uffer, so it may
37ab0 20 62 65 20 73 61 66 65 6c 79 20 66 72 65 65 64   be safely freed
37ac0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20   here. */.      
37ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
37ae0 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a 20 20  eFree(pFree);.  
37af0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
37b00 20 20 20 20 20 2f 2a 20 54 68 65 20 70 53 70 61       /* The pSpa
37b10 63 65 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62  ce buffer will b
37b20 65 20 66 72 65 65 64 20 61 66 74 65 72 20 74 68  e freed after th
37b30 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 20  e next call to. 
37b40 20 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61           ** bala
37b50 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2c 20 6f  nce_nonroot(), o
37b60 72 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 68  r just before th
37b70 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
37b80 72 6e 73 2c 20 77 68 69 63 68 65 76 65 72 0a 20  rns, whichever. 
37b90 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6d 65           ** come
37ba0 73 20 66 69 72 73 74 2e 20 2a 2f 0a 20 20 20 20  s first. */.    
37bb0 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 53        pFree = pS
37bc0 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pace;.        }.
37bd0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
37be0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
37bf0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  = 0;..      /* T
37c00 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
37c10 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
37c20 20 62 61 6c 61 6e 63 65 73 20 74 68 65 20 70 61   balances the pa
37c30 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
37c40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
37c50 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 43  pPage);.      pC
37c60 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20  ur->iPage--;.   
37c70 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d   }.  }while( rc=
37c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
37c90 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20   if( pFree ){.  
37ca0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
37cb0 65 28 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  e(pFree);.  }.  
37cc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
37cd0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
37ce0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
37cf0 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
37d00 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
37d10 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
37d20 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
37d30 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
37d40 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
37d50 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
37d60 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
37d70 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
37d80 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
37d90 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
37da0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
37db0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
37dc0 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
37dd0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
37de0 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
37df0 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
37e00 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
37e10 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
37e20 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
37e30 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
37e40 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
37e50 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
37e60 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
37e70 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72  e seekResult par
37e80 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
37e90 72 6f 2c 20 74 68 65 6e 20 61 20 73 75 63 63 65  ro, then a succe
37ea0 73 73 66 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a  ssful call to.**
37eb0 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28   MovetoUnpacked(
37ec0 29 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72  ) to seek cursor
37ed0 20 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20   pCur to (pKey, 
37ee0 6e 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61 64  nKey) has alread
37ef0 79 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72  y.** been perfor
37f00 6d 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20  med. seekResult 
37f10 69 73 20 74 68 65 20 73 65 61 72 63 68 20 72 65  is the search re
37f20 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61  sult returned (a
37f30 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d   negative.** num
37f40 62 65 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e  ber if pCur poin
37f50 74 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ts at an entry t
37f60 68 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  hat is smaller t
37f70 68 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29  han (pKey, nKey)
37f80 2c 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69  , or.** a positi
37f90 76 65 20 76 61 6c 75 65 20 69 66 20 70 43 75 72  ve value if pCur
37fa0 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74   points at an et
37fb0 72 79 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ry that is large
37fc0 72 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79  r than .** (pKey
37fd0 2c 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a  , nKey)). .**.**
37fe0 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75   If the seekResu
37ff0 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  lt parameter is 
38000 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
38010 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
38020 74 65 65 73 20 74 68 61 74 0a 2a 2a 20 63 75 72  tees that.** cur
38030 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
38040 74 69 6e 67 20 61 74 20 74 68 65 20 65 78 69 73  ting at the exis
38050 74 69 6e 67 20 63 6f 70 79 20 6f 66 20 61 20 72  ting copy of a r
38060 6f 77 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  ow that is to be
38070 0a 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 2e  .** overwritten.
38080 20 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73    If the seekRes
38090 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  ult parameter is
380a0 20 30 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20   0, then cursor 
380b0 70 43 75 72 20 6d 61 79 0a 2a 2a 20 70 6f 69 6e  pCur may.** poin
380c0 74 20 74 6f 20 61 6e 79 20 65 6e 74 72 79 20 6f  t to any entry o
380d0 72 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74  r to no entry at
380e0 20 61 6c 6c 20 61 6e 64 20 73 6f 20 74 68 69 73   all and so this
380f0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f   function has to
38100 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72   seek.** the cur
38110 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e  sor before the n
38120 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e  ew key can be in
38130 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
38140 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
38150 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
38160 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
38170 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
38180 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
38190 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
381a0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
381b0 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
381c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
381d0 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
381e0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
381f0 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
38200 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
38210 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
38220 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
38230 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
38240 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
38250 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
38260 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
38270 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
38280 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20  pendBias,       
38290 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
382a0 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
382b0 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
382c0 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74    int seekResult
382d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382e0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72   /* Result of pr
382f0 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  ior MovetoUnpack
38300 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a  ed() call */.){.
38310 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
38320 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74  loc = seekResult
38330 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2d 31  ;          /* -1
38340 3a 20 62 65 66 6f 72 65 20 64 65 73 69 72 65 64  : before desired
38350 20 6c 6f 63 61 74 69 6f 6e 20 20 2b 31 3a 20 61   location  +1: a
38360 66 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  fter */.  int sz
38370 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  New = 0;.  int i
38380 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
38390 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
383a0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
383b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
383c0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
383d0 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
383e0 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
383f0 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
38400 30 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  0;..  if( pCur->
38410 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
38420 41 55 4c 54 20 29 7b 0a 20 20 20 20 61 73 73 65  AULT ){.    asse
38430 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
38440 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
38450 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
38460 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
38470 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
38480 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
38490 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
384a0 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70  Cur->wrFlag && p
384b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69