/ Hex Artifact Content
Login

Artifact 46eae4a082c1515ac50dd14542b7e7ae7cc7916a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74 65  mplements a exte
0190: 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65 64  rnal (disk-based
01a0: 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  ) database using
01b0: 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65 20   BTrees..** See 
01c0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
01d0: 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74 2e  nt on "btreeInt.
01e0: 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  h" for additiona
01f0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
0200: 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64 65  * Including a de
0210: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69 6c  scription of fil
0220: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e 20  e format and an 
0230: 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65 72  overview of oper
0240: 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  ation..*/.#inclu
0250: 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22 0a  de "btreeInt.h".
0260: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64 65  ./*.** The heade
0270: 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61 70  r string that ap
0280: 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65 67  pears at the beg
0290: 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79 0a  inning of every.
02a0: 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ** SQLite databa
02b0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  se..*/.static co
02c0: 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63 48  nst char zMagicH
02d0: 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54 45  eader[] = SQLITE
02e0: 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a 2f  _FILE_HEADER;../
02f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67 6c  *.** Set this gl
0300: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 6f  obal variable to
0310: 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72 61   1 to enable tra
0320: 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 54  cing using the T
0330: 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a 2a  RACE.** macro..*
0340: 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c 69  /.#if 0.int sqli
0350: 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31 3b  te3BtreeTrace=1;
0360: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e 61    /* True to ena
0370: 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  ble tracing */.#
0380: 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29   define TRACE(X)
0390: 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72 65    if(sqlite3Btre
03a0: 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20 58  eTrace){printf X
03b0: 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b  ;fflush(stdout);
03c0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
03d0: 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69 66   TRACE(X).#endif
03e0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74 20  ../*.** Extract 
03f0: 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  a 2-byte big-end
0400: 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  ian integer from
0410: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e 73   an array of uns
0420: 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a 20  igned bytes..** 
0430: 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75 65  But if the value
0440: 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20 69   is zero, make i
0450: 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20 54  t 65536..**.** T
0460: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
0470: 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20 74  sed to extract t
0480: 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63 65  he "offset to ce
0490: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 22  ll content area"
04a0: 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20 74   value.** from t
04b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20 62  he header of a b
04c0: 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20 74  tree page.  If t
04d0: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
04e0: 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70 61  65536 and the pa
04f0: 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c 20  ge.** is empty, 
0500: 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75 6c  the offset shoul
0510: 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74 20  d be 65536, but 
0520: 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75 65  the 2-byte value
0530: 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a 2a   stores zero..**
0540: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
0550: 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72  kes the necessar
0560: 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f 20  y adjustment to 
0570: 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69 6e  65536..*/.#defin
0580: 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  e get2byteNotZer
0590: 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29 67  o(X)  (((((int)g
05a0: 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26 30  et2byte(X))-1)&0
05b0: 78 66 66 66 66 29 2b 31 29 0a 0a 23 69 66 6e 64  xffff)+1)..#ifnd
05c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
05e0: 2a 20 41 20 6c 69 73 74 20 6f 66 20 42 74 53 68  * A list of BtSh
05f0: 61 72 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61  ared objects tha
0600: 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66  t are eligible f
0610: 6f 72 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e  or participation
0620: 0a 2a 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61  .** in shared ca
0630: 63 68 65 2e 20 20 54 68 69 73 20 76 61 72 69 61  che.  This varia
0640: 62 6c 65 20 68 61 73 20 66 69 6c 65 20 73 63 6f  ble has file sco
0650: 70 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c  pe during normal
0660: 20 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20   builds,.** but 
0670: 74 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73  the test harness
0680: 20 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73   needs to access
0690: 20 69 74 20 73 6f 20 77 65 20 6d 61 6b 65 20 69   it so we make i
06a0: 74 20 67 6c 6f 62 61 6c 20 66 6f 72 20 0a 2a 2a  t global for .**
06b0: 20 74 65 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2a   test builds..**
06c0: 0a 2a 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68  .** Access to th
06d0: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 70  is variable is p
06e0: 72 6f 74 65 63 74 65 64 20 62 79 20 53 51 4c 49  rotected by SQLI
06f0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
0700: 4d 41 53 54 45 52 2e 0a 2a 2f 0a 23 69 66 64 65  MASTER..*/.#ifde
0710: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0720: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0730: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0740: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0750: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0760: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0770: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
0780: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
0790: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
07a0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
07b0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
07c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
07d0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
07e0: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
07f0: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0800: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0810: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0820: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0830: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0840: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0850: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0860: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0870: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
0880: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
0890: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
08a0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
08b0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
08c0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
08d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
08e0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
08f0: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0900: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
0910: 50 50 4c 45 5f 5f 29 20 26 26 20 21 64 65 66 69  PPLE__) && !defi
0920: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
0930: 20 26 26 20 21 64 65 66 69 6e 65 64 28 54 48 33   && !defined(TH3
0940: 5f 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 29 0a  _COMPATIBILITY).
0950: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 67 6c 6f 62    /* Enable glob
0960: 61 6c 20 73 68 61 72 65 64 20 63 61 63 68 65 20  al shared cache 
0970: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 65 62  function for deb
0980: 75 67 67 69 6e 67 20 61 6e 64 20 75 6e 69 74 20  ugging and unit 
0990: 74 65 73 74 73 2c 20 0a 20 20 2a 2a 20 62 75 74  tests, .  ** but
09a0: 20 6e 6f 74 20 66 6f 72 20 72 65 6c 65 61 73 65   not for release
09b0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   */.  return SQL
09c0: 49 54 45 5f 4d 49 53 55 53 45 3b 0a 23 65 6c 73  ITE_MISUSE;.#els
09d0: 65 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e.  sqlite3Globa
09e0: 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
09f0: 63 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61  cheEnabled = ena
0a00: 62 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ble;.  return SQ
0a10: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
0a20: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66 64  }.#endif....#ifd
0a30: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
0a40: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
0a50: 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  .  ** The functi
0a60: 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64 43  ons querySharedC
0a70: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c  acheTableLock(),
0a80: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0a90: 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a 2a  ableLock(),.  **
0aa0: 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68 61   and clearAllSha
0ab0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0ac0: 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75  ks().  ** manipu
0ad0: 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20  late entries in 
0ae0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f  the BtShared.pLo
0af0: 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75  ck linked list u
0b00: 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a  sed to store.  *
0b10: 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74  * shared-cache t
0b20: 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73  able level locks
0b30: 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79  . If the library
0b40: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   is compiled wit
0b50: 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65  h the.  ** share
0b60: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
0b70: 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74  disabled, then t
0b80: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65  here is only eve
0b90: 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20  r one user.  ** 
0ba0: 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64  of each BtShared
0bb0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73   structure and s
0bc0: 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69  o this locking i
0bd0: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0be0: 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65   .  ** So define
0bf0: 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65   the lock relate
0c00: 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e  d functions as n
0c10: 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64  o-ops..  */.  #d
0c20: 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72 65  efine queryShare
0c30: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0c40: 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f 4b  a,b,c) SQLITE_OK
0c50: 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53 68  .  #define setSh
0c60: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c70: 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45  ck(a,b,c) SQLITE
0c80: 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63 6c  _OK.  #define cl
0c90: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ca0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0cb0: 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72 61   #define downgra
0cc0: 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
0cd0: 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20 20  TableLocks(a).  
0ce0: 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72 65  #define hasShare
0cf0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0d00: 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64 65  a,b,c,d) 1.  #de
0d10: 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e 66  fine hasReadConf
0d20: 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23 65  licts(a, b) 0.#e
0d30: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
0d40: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0d50: 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53  _CACHE..#ifdef S
0d60: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
0d70: 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  *** This functio
0d80: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0d90: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0da0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0db0: 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b   ***.**.** Check
0dc0: 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72 65   to see if pBtre
0dd0: 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75  e holds the requ
0de0: 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65  ired locks to re
0df0: 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74  ad or write to t
0e00: 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74  he .** table wit
0e10: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0e20: 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69 66  t.   Return 1 if
0e30: 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69   it does and 0 i
0e40: 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  f not..**.** For
0e50: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77   example, when w
0e60: 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c  riting to a tabl
0e70: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
0e80: 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42   iRoot via .** B
0e90: 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  tree connection 
0ea0: 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  pBtree:.**.**   
0eb0: 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72   assert( hasShar
0ec0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0ed0: 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20  (pBtree, iRoot, 
0ee0: 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29  0, WRITE_LOCK) )
0ef0: 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69  ;.**.** When wri
0f00: 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
0f10: 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69 6e   that resides in
0f20: 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74 61   a sharable data
0f30: 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61  base, the .** ca
0f40: 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65  ller should have
0f50: 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20   first obtained 
0f60: 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e  a lock specifyin
0f70: 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  g the root page 
0f80: 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73  of.** the corres
0f90: 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54  ponding table. T
0fa0: 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73  his makes things
0fb0: 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70   a bit more comp
0fc0: 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74  licated,.** as t
0fd0: 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74  his module treat
0fe0: 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73 20  s each table as 
0ff0: 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75 63  a separate struc
1000: 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69  ture. To determi
1010: 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  ne.** the table 
1020: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
1030: 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67   the index being
1040: 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a   written, this.*
1050: 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  * function has t
1060: 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67 68  o search through
1070: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1080: 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  hema..**.** Inst
1090: 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e  ead of a lock on
10a0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
10b0: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
10c0: 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65  iRoot, the calle
10d0: 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20  r may.** hold a 
10e0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
10f0: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28  e schema table (
1100: 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68  root page 1). Th
1110: 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63  is is also.** ac
1120: 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ceptable..*/.sta
1130: 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72 65  tic int hasShare
1140: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1150: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
1160: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e  ,         /* Han
1170: 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f  dle that must ho
1180: 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e  ld lock */.  Pgn
1190: 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  o iRoot,        
11a0: 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
11b0: 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20   of b-tree */.  
11c0: 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20  int isIndex,    
11d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
11e0: 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72  f iRoot is the r
11f0: 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  oot of an index 
1200: 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20  b-tree */.  int 
1210: 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20  eLockType       
1220: 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c     /* Required l
1230: 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c  ock type (READ_L
1240: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
1250: 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d  K) */.){.  Schem
1260: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63  a *pSchema = (Sc
1270: 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70  hema *)pBtree->p
1280: 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50  Bt->pSchema;.  P
1290: 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20  gno iTab = 0;.  
12a0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  BtLock *pLock;..
12b0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
12c0: 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61  abase is not sha
12d0: 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68  reable, or if th
12e0: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
12f0: 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73  ing.  ** and has
1300: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
1310: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20  itted flag set, 
1320: 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20  then no lock is 
1330: 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20  required. .  ** 
1340: 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65  Return true imme
1350: 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20  diately..  */.  
1360: 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61  if( (pBtree->sha
1370: 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  rable==0).   || 
1380: 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44  (eLockType==READ
1390: 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65  _LOCK && (pBtree
13a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
13b0: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
13c0: 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20 20  tted)).  ){.    
13d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
13e0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65 6e   /* If the clien
13f0: 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f 72  t is reading  or
1400: 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64 65   writing an inde
1410: 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d 61  x and the schema
1420: 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f 61   is.  ** not loa
1430: 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ded, then it is 
1440: 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74 6f  too difficult to
1450: 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b 20   actually check 
1460: 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20 74  to see if.  ** t
1470: 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 73  he correct locks
1480: 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20 64   are held.  So d
1490: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20 6a  o not bother - j
14a0: 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e  ust return true.
14b0: 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65 20  .  ** This case 
14c0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75 70  does not come up
14d0: 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79 68   very often anyh
14e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ow..  */.  if( i
14f0: 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63 68  sIndex && (!pSch
1500: 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d  ema || (pSchema-
1510: 3e 66 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61  >flags&DB_Schema
1520: 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20  Loaded)==0) ){. 
1530: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1540: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1550: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
1560: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
1570: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
1580: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
1590: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
15a0: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
15b0: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
15c0: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
15d0: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
15e0: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
15f0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
1600: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
1610: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
1620: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
1630: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
1640: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
1650: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
1660: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
1670: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
1680: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
1690: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
16a0: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
16b0: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
16c0: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
16d0: 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74  tnum==(int)iRoot
16e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 61 62   ){.        iTab
16f0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
1700: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  >tnum;.      }. 
1710: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1720: 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a    iTab = iRoot;.
1730: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68    }..  /* Search
1740: 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65   for the require
1750: 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61  d lock. Either a
1760: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72   write-lock on r
1770: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61  oot-page iTab, a
1780: 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63   .  ** write-loc
1790: 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20  k on the schema 
17a0: 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68  table, or (if th
17b0: 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64  e client is read
17c0: 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64  ing) a.  ** read
17d0: 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69  -lock on iTab wi
17e0: 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75  ll suffice. Retu
17f0: 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74  rn 1 if any of t
1800: 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20  hese are found. 
1810: 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d   */.  for(pLock=
1820: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f  pBtree->pBt->pLo
1830: 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  ck; pLock; pLock
1840: 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a  =pLock->pNext){.
1850: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
1860: 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20  Btree==pBtree . 
1870: 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69      && (pLock->i
1880: 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28  Table==iTab || (
1890: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pLock->eLock==WR
18a0: 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63  ITE_LOCK && pLoc
18b0: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20  k->iTable==1)). 
18c0: 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c      && pLock->eL
18d0: 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a  ock>=eLockType .
18e0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
18f0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1900: 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f  ..  /* Failed to
1910: 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72   find the requir
1920: 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65  ed lock. */.  re
1930: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1940: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
1950: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1960: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a  TE_DEBUG./*.****
1970: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1980: 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61  ay be used as pa
1990: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  rt of assert() s
19a0: 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20  tatements only. 
19b0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ****.**.** Retur
19c0: 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75  n true if it wou
19d0: 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f  ld be illegal fo
19e0: 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74  r pBtree to writ
19f0: 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61  e into the.** ta
1a00: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f  ble or index roo
1a10: 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63  ted at iRoot bec
1a20: 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65  ause other share
1a30: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  d connections ar
1a40: 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75  e.** simultaneou
1a50: 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74  sly reading that
1a60: 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69   same table or i
1a70: 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  ndex..**.** It i
1a80: 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42  s illegal for pB
1a90: 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66  tree to write if
1aa0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65   some other Btre
1ab0: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  e object that.**
1ac0: 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65   shares the same
1ad0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
1ae0: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65   is currently re
1af0: 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1b00: 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61  .** the iRoot ta
1b10: 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66  ble.  Except, if
1b20: 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65   the other Btree
1b30: 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a   object has the.
1b40: 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  ** read-uncommit
1b50: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1b60: 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  en it is OK for 
1b70: 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74  the other object
1b80: 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65   to.** have a re
1b90: 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ad cursor..**.**
1ba0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1bb0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1bc0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1bd0: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a  table or index.*
1be0: 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  * rooted at page
1bf0: 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75   iRoot, one shou
1c00: 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20  ld call:.**.**  
1c10: 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
1c20: 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72  adConflicts(pBtr
1c30: 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f  ee, iRoot) );.*/
1c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52  .static int hasR
1c50: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72  eadConflicts(Btr
1c60: 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f  ee *pBtree, Pgno
1c70: 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72   iRoot){.  BtCur
1c80: 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  sor *p;.  for(p=
1c90: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
1ca0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
1cb0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  ext){.    if( p-
1cc0: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
1cd0: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74   .     && p->pBt
1ce0: 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20  ree!=pBtree.    
1cf0: 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65   && 0==(p->pBtre
1d00: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1d10: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1d20: 69 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20  itted).    ){.  
1d30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1d40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1d50: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20   0;.}.#endif    
1d60: 2f 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  /* #ifdef SQLITE
1d70: 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _DEBUG */../*.**
1d80: 20 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66   Query to see if
1d90: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20   Btree handle p 
1da0: 6d 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63  may obtain a loc
1db0: 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20  k of type eLock 
1dc0: 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f  .** (READ_LOCK o
1dd0: 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e  r WRITE_LOCK) on
1de0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
1df0: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20  root-page iTab. 
1e00: 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  Return.** SQLITE
1e10: 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  _OK if the lock 
1e20: 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20  may be obtained 
1e30: 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  (by calling.** s
1e40: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1e50: 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51  leLock()), or SQ
1e60: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e  LITE_LOCKED if n
1e70: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1e80: 74 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  t querySharedCac
1e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65  heTableLock(Btre
1ea0: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c  e *p, Pgno iTab,
1eb0: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
1ec0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1ed0: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
1ee0: 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  pIter;..  assert
1ef0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
1f00: 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
1f10: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
1f20: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f  READ_LOCK || eLo
1f30: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29  ck==WRITE_LOCK )
1f40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64  ;.  assert( p->d
1f50: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
1f60: 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( !(p->db->flags
1f70: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1f80: 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d  mmitted)||eLock=
1f90: 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61  =WRITE_LOCK||iTa
1fa0: 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  b==1 );.  .  /* 
1fb0: 49 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  If requesting a 
1fc0: 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e  write-lock, then
1fd0: 20 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20   the Btree must 
1fe0: 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69  have an open wri
1ff0: 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  te.  ** transact
2000: 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ion on this file
2010: 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79  . And, obviously
2020: 2c 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65  , for this to be
2030: 20 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20   so there .  ** 
2040: 6d 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20  must be an open 
2050: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
2060: 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74  n on the file it
2070: 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  self..  */.  ass
2080: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2090: 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74  _LOCK || (p==pBt
20a0: 2d 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e  ->pWriter && p->
20b0: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20c0: 52 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72  RITE) );.  asser
20d0: 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  t( eLock==READ_L
20e0: 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  OCK || pBt->inTr
20f0: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
2100: 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f  _WRITE );.  .  /
2110: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
2120: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
2130: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73   shared-cache is
2140: 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   not enabled */.
2150: 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
2160: 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  le ){.    return
2170: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2180: 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74  .  /* If some ot
2190: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
21a0: 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63  s holding an exc
21b0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65  lusive lock, the
21c0: 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20  .  ** requested 
21d0: 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20  lock may not be 
21e0: 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20  obtained..  */. 
21f0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
2200: 72 21 3d 70 20 26 26 20 70 42 74 2d 3e 69 73 45  r!=p && pBt->isE
2210: 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
2220: 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
2230: 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
2240: 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
2250: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2260: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
2270: 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20  EDCACHE;.  }..  
2280: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2290: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
22a0: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
22b0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e  {.    /* The con
22c0: 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65  dition (pIter->e
22d0: 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20  Lock!=eLock) in 
22e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66  the following if
22f0: 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74  (...) .    ** st
2300: 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69 6d  atement is a sim
2310: 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a  plification of:.
2320: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
2330: 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  (eLock==WRITE_LO
2340: 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f  CK || pIter->eLo
2350: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a  ck==WRITE_LOCK).
2360: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69      **.    ** si
2370: 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nce we know that
2380: 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   if eLock==WRITE
2390: 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f  _LOCK, then no o
23a0: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  ther connection.
23b0: 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20      ** may hold 
23c0: 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20  a WRITE_LOCK on 
23d0: 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68 69  any table in thi
23e0: 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74 68  s file (since th
23f0: 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f  ere can.    ** o
2400: 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65 20  nly be a single 
2410: 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a  writer)..    */.
2420: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
2430: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2440: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2450: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2460: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
2470: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2480: 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  || pIter->pBtree
2490: 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  ==p || pIter->eL
24a0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b  ock==READ_LOCK);
24b0: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
24c0: 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74  pBtree!=p && pIt
24d0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
24e0: 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   && pIter->eLock
24f0: 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  !=eLock ){.     
2500: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2510: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2520: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
2530: 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  db);.      if( e
2540: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2550: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2560: 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69  rt( p==pBt->pWri
2570: 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ter );.        p
2580: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
2590: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
25a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
25b0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
25c0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  E;.    }.  }.  r
25d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
25f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2600: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
2610: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2620: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
2630: 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20  * Add a lock on 
2640: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2650: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20  oot-page iTable 
2660: 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
2670: 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42  ree used.** by B
2680: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50  tree handle p. P
2690: 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d  arameter eLock m
26a0: 75 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45  ust be either RE
26b0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57  AD_LOCK or .** W
26c0: 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  RITE_LOCK..**.**
26d0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
26e0: 73 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f  ssumes the follo
26f0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61  wing:.**.**   (a
2700: 29 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ) The specified 
2710: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69  Btree object p i
2720: 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
2730: 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20   sharable.**    
2740: 20 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65     database (one
2750: 20 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72   with the BtShar
2760: 65 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67  ed.sharable flag
2770: 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a   set), and.**.**
2780: 20 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20     (b) No other 
2790: 42 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f  Btree objects ho
27a0: 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63  ld a lock that c
27b0: 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20  onflicts.**     
27c0: 20 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65    with the reque
27d0: 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20  sted lock (i.e. 
27e0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
27f0: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a  TableLock() has.
2800: 2a 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79  **       already
2810: 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64   been called and
2820: 20 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45   returned SQLITE
2830: 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  _OK)..**.** SQLI
2840: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2850: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2860: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
2870: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  lly. SQLITE_NOME
2880: 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  M .** is returne
2890: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74  d if a malloc at
28a0: 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a  tempt fails..*/.
28b0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68  static int setSh
28c0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
28d0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
28e0: 6f 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f  o iTable, u8 eLo
28f0: 63 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ck){.  BtShared 
2900: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2910: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
2920: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49   0;.  BtLock *pI
2930: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2940: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2950: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2960: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2970: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2980: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2990: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
29a0: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f  =0 );..  /* A co
29b0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68  nnection with th
29c0: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
29d0: 65 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c  ed flag set will
29e0: 20 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20   never try to.  
29f0: 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64  ** obtain a read
2a00: 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73  -lock using this
2a10: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f   function. The o
2a20: 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62  nly read-lock ob
2a30: 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61  tained.  ** by a
2a40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72   connection in r
2a50: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
2a60: 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73  mode is on the s
2a70: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20  qlite_master .  
2a80: 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  ** table, and th
2a90: 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  at lock is obtai
2aa0: 6e 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69  ned in BtreeBegi
2ab0: 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20  nTrans().  */.  
2ac0: 61 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64  assert( 0==(p->d
2ad0: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
2ae0: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2af0: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2b00: 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54  _LOCK );..  /* T
2b10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
2b20: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
2b30: 65 64 20 6f 6e 20 61 20 73 68 61 72 61 62 6c 65  ed on a sharable
2b40: 20 62 2d 74 72 65 65 20 61 66 74 65 72 20 69 74   b-tree after it
2b50: 20 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20   .  ** has been 
2b60: 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
2b70: 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72 65 65 20  no other b-tree 
2b80: 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c 69 63 74  holds a conflict
2b90: 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  ing lock.  */.  
2ba0: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
2bb0: 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
2bc0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72   SQLITE_OK==quer
2bd0: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
2be0: 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
2bf0: 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a   eLock) );..  /*
2c00: 20 46 69 72 73 74 20 73 65 61 72 63 68 20 74 68   First search th
2c10: 65 20 6c 69 73 74 20 66 6f 72 20 61 6e 20 65 78  e list for an ex
2c20: 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74  isting lock on t
2c30: 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  his table. */.  
2c40: 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
2c50: 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
2c60: 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
2c70: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  {.    if( pIter-
2c80: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20  >iTable==iTable 
2c90: 26 26 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  && pIter->pBtree
2ca0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f  ==p ){.      pLo
2cb0: 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20 20 20 20  ck = pIter;.    
2cc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2cd0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2ce0: 61 62 6f 76 65 20 73 65 61 72 63 68 20 64 69 64  above search did
2cf0: 20 6e 6f 74 20 66 69 6e 64 20 61 20 42 74 4c 6f   not find a BtLo
2d00: 63 6b 20 73 74 72 75 63 74 20 61 73 73 6f 63 69  ck struct associ
2d10: 61 74 69 6e 67 20 42 74 72 65 65 20 70 0a 20 20  ating Btree p.  
2d20: 2a 2a 20 77 69 74 68 20 74 61 62 6c 65 20 69 54  ** with table iT
2d30: 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f  able, allocate o
2d40: 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69  ne and link it i
2d50: 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 0a 20 20  nto the list..  
2d60: 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  */.  if( !pLock 
2d70: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28  ){.    pLock = (
2d80: 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33  BtLock *)sqlite3
2d90: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
2da0: 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20  f(BtLock));.    
2db0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2dc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dd0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
2de0: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
2df0: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
2e00: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
2e10: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
2e20: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
2e30: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
2e40: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
2e50: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
2e60: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
2e70: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
2e80: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
2e90: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
2ea0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
2eb0: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
2ec0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
2ed0: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
2ee0: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
2ef0: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
2f00: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
2f10: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
2f20: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
2f30: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
2f40: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
2f50: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
2f60: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
2f70: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
2f80: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
2f90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2fa0: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2fb0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2fc0: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2fe0: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
2ff0: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3000: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3010: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3020: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3030: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
3040: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
3050: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
3060: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
3070: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
3080: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
3090: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
30a0: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
30b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
30c0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
30d0: 65 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  en the BtShared.
30e0: 69 73 50 65 6e 64 69 6e 67 20 76 61 72 69 61 62  isPending variab
30f0: 6c 65 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  le.** may be inc
3100: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3120: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3130: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3140: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3150: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3160: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
3170: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
3180: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
3190: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
31a0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
31b0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
31c0: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
31d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
31e0: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
31f0: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3200: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3210: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3220: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
3230: 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  >isExclusive==0 
3240: 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  || pBt->pWriter=
3250: 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29  =pLock->pBtree )
3260: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
3270: 6f 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54  ock->pBtree->inT
3280: 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f  rans>=pLock->eLo
3290: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  ck );.    if( pL
32a0: 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ock->pBtree==p )
32b0: 7b 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20  {.      *ppIter 
32c0: 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLock->pNext;.
32d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
32e0: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c  ock->iTable!=1 |
32f0: 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63  | pLock==&p->loc
3300: 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  k );.      if( p
3310: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20  Lock->iTable!=1 
3320: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3330: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
3340: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
3350: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
3360: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
3370: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
3380: 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e  sert( pBt->isPen
3390: 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  ding==0 || pBt->
33a0: 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28  pWriter );.  if(
33b0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
33c0: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72   ){.    pBt->pWr
33d0: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
33e0: 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
33f0: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   0;.    pBt->isP
3400: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65  ending = 0;.  }e
3410: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
3420: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
3430: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
3440: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
3450: 68 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63  hen Btree p is c
3460: 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20  oncluding its . 
3470: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
3480: 6e 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72  n. If there curr
3490: 65 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77  ently exists a w
34a0: 72 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20  riter, and p is 
34b0: 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  not.    ** that 
34c0: 77 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65  writer, then the
34d0: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   number of locks
34e0: 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
34f0: 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a  ions other.    *
3500: 2a 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65  * than the write
3510: 72 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20  r must be about 
3520: 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e  to drop to zero.
3530: 20 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20   In this case.  
3540: 20 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73 50    ** set the isP
3550: 65 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20 30  ending flag to 0
3560: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
3570: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  If there is not 
3580: 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74  currently a writ
3590: 65 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72 65  er, then BtShare
35a0: 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73 74  d.isPending must
35b0: 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20  .    ** be zero 
35c0: 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73  already. So this
35d0: 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61   next line is ha
35e0: 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63  rmless in that c
35f0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
3600: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d  pBt->isPending =
3610: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
3620: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
3630: 68 61 6e 67 65 73 20 61 6c 6c 20 77 72 69 74 65  hanges all write
3640: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 42  -locks held by B
3650: 74 72 65 65 20 70 20 69 6e 74 6f 20 72 65 61 64  tree p into read
3660: 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69  -locks..*/.stati
3670: 63 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65  c void downgrade
3680: 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
3690: 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  bleLocks(Btree *
36a0: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
36b0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
36c0: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
36d0: 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  ==p ){.    BtLoc
36e0: 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  k *pLock;.    pB
36f0: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3700: 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75      pBt->isExclu
3710: 73 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42  sive = 0;.    pB
3720: 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30  t->isPending = 0
3730: 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d  ;.    for(pLock=
3740: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63  pBt->pLock; pLoc
3750: 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e  k; pLock=pLock->
3760: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
3770: 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  sert( pLock->eLo
3780: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
3790: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
37a0: 70 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b  p );.      pLock
37b0: 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  ->eLock = READ_L
37c0: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  OCK;.    }.  }.}
37d0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
37e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
37f0: 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ACHE */..static 
3800: 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
3810: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3820: 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  ;  /* Forward re
3830: 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a  ference */../*.*
3840: 2a 2a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  **** This routin
3850: 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  e is used inside
3860: 20 6f 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c   of assert() onl
3870: 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72  y ****.**.** Ver
3880: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
3890: 73 6f 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75  sor holds the mu
38a0: 74 65 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61  tex on its BtSha
38b0: 72 65 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  red.*/.#ifdef SQ
38c0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
38d0: 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64  c int cursorHold
38e0: 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72 20  sMutex(BtCursor 
38f0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  *p){.  return sq
3900: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
3910: 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b  (p->pBt->mutex);
3920: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e  .}.#endif...#ifn
3930: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3940: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49  INCRBLOB./*.** I
3950: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3960: 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
3970: 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73 6f   cache for curso
3980: 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a  r pCur, if any..
3990: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
39a0: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
39b0: 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72 20  wCache(BtCursor 
39c0: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
39d0: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
39e0: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
39f0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
3a00: 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70  >aOverflow);.  p
3a10: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
3a20: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
3a30: 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72  alidate the over
3a40: 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
3a50: 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72  ache for all cur
3a60: 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f  sors opened.** o
3a70: 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  n the shared btr
3a80: 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74  ee structure pBt
3a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3aa0: 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
3ab0: 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68  erflowCache(BtSh
3ac0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74  ared *pBt){.  Bt
3ad0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
3ae0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3af0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3b00: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70  ex) );.  for(p=p
3b10: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
3b20: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
3b30: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3b40: 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d  lowCache(p);.  }
3b50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
3b60: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
3b70: 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  d before modifyi
3b80: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
3b90: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f  of a table.** to
3ba0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
3bb0: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
3bc0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
3bd0: 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20  n the.** row or 
3be0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20  one of the rows 
3bf0: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
3c00: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
3c10: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3c20: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
3c30: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
3c40: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
3c50: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
3c60: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
3c70: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
3c80: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
3c90: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
3ca0: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
3cb0: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
3cc0: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
3cd0: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
3ce0: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
3cf0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
3d00: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
3d10: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
3d20: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
3d30: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
3d40: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
3d50: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
3d60: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
3d70: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
3d80: 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69   on that specifi
3d90: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
3da0: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3db0: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
3dc0: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
3dd0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
3de0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3df0: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36  to check */.  i6
3e00: 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20  4 iRow,         
3e10: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
3e20: 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  id that might be
3e30: 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69   changing */.  i
3e40: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3e50: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
3e60: 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62  f all rows are b
3e70: 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
3e80: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
3e90: 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
3ea0: 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b  t = pBtree->pBt;
3eb0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3ec0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
3ed0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66  x(pBtree) );.  f
3ee0: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3ef0: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3f00: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73  ){.    if( p->is
3f10: 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
3f20: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
3f30: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
3f40: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
3f50: 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
3f60: 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
3f70: 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20  }.  }.}..#else. 
3f80: 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69 6f   /* Stub functio
3f90: 6e 73 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  ns when INCRBLOB
3fa0: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
3fb0: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
3fc0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3fd0: 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  (x).  #define in
3fe0: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
3ff0: 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23 64  lowCache(x).  #d
4000: 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65  efine invalidate
4010: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
4020: 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a  x,y,z).#endif /*
4030: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4040: 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  RBLOB */../*.** 
4050: 53 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20  Set bit pgno of 
4060: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4070: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4080: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20   This is called 
4090: 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20  .** when a page 
40a0: 74 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20  that previously 
40b0: 63 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62  contained data b
40c0: 65 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69  ecomes a free-li
40d0: 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65  st leaf .** page
40e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68  ..**.** The BtSh
40f0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4100: 20 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74   bitvec exists t
4110: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e  o work around an
4120: 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20   obscure.** bug 
4130: 63 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e  caused by the in
4140: 74 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f  teraction of two
4150: 20 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d   useful IO optim
4160: 69 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e  izations surroun
4170: 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73  ding.** free-lis
4180: 74 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a  t leaf pages:.**
4190: 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c  .**   1) When al
41a0: 6c 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65  l data is delete
41b0: 64 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e  d from a page an
41c0: 64 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d  d the page becom
41d0: 65 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65  es.**      a fre
41e0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
41f0: 2c 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  , the page is no
4200: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
4210: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
4220: 20 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20    (as free-list 
4230: 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61  leaf pages conta
4240: 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c  in no meaningful
4250: 20 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65   data). Sometime
4260: 73 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61  s.**      such a
4270: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65   page is not eve
4280: 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73  n journalled (as
4290: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
42a0: 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20  modified,.**    
42b0: 20 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75    why bother jou
42c0: 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a  rnalling it?)..*
42d0: 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61  *.**   2) When a
42e0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
42f0: 70 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20  page is reused, 
4300: 69 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  its content is n
4310: 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20  ot read.**      
4320: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
4330: 65 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20  e or written to 
4340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4350: 20 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a   (why should it.
4360: 2a 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69  **      be, if i
4370: 74 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20  t is not at all 
4380: 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a  meaningful?)..**
4390: 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65  .** By themselve
43a0: 73 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a  s, these optimiz
43b0: 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65  ations work fine
43c0: 20 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68   and provide a h
43d0: 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61  andy.** performa
43e0: 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c  nce boost to bul
43f0: 6b 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65  k delete or inse
4400: 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48  rt operations. H
4410: 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20  owever, if.** a 
4420: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f  page is moved to
4430: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
4440: 6e 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77  nd then reused w
4450: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a  ithin the same.*
4460: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  * transaction, a
4470: 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75   problem comes u
4480: 70 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69  p. If the page i
4490: 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64  s not journalled
44a0: 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d   when.** it is m
44b0: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
44c0: 2d 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20  -list and it is 
44d0: 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  also not journal
44e0: 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69  led when it.** i
44f0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
4500: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
4510: 6e 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20  nd reused, then 
4520: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
4530: 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74  a.** may be lost
4540: 2e 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  . In the event o
4550: 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74  f a rollback, it
4560: 20 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73   may not be poss
4570: 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  ible.** to resto
4580: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
4590: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
45a0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
45b0: 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f  *.** The solutio
45c0: 6e 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65  n is the BtShare
45d0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
45e0: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
45f0: 20 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76   page is .** mov
4600: 65 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66  ed to become a f
4610: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4620: 67 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ge, the correspo
4630: 6e 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20  nding bit is.** 
4640: 73 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65  set in the bitve
4650: 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65  c. Whenever a le
4660: 61 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61  af page is extra
4670: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4680: 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69  ee-list,.** opti
4690: 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65  mization 2 above
46a0: 20 69 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74   is omitted if t
46b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
46c0: 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a   bit is already.
46d0: 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72  ** set in BtShar
46e0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20  ed.pHasContent. 
46f0: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
4700: 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63  the bitvec are c
4710: 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65  leared.** at the
4720: 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72   end of every tr
4730: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
4740: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65  atic int btreeSe
4750: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
4760: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
4770: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20  pgno){.  int rc 
4780: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
4790: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
47a0: 74 65 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65  tent ){.    asse
47b0: 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e  rt( pgno<=pBt->n
47c0: 50 61 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d  Page );.    pBt-
47d0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73  >pHasContent = s
47e0: 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
47f0: 74 65 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  te(pBt->nPage);.
4800: 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48      if( !pBt->pH
4810: 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20  asContent ){.   
4820: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4830: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
4840: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4850: 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c  _OK && pgno<=sql
4860: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4870: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4880: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
4890: 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42  ite3BitvecSet(pB
48a0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20  t->pHasContent, 
48b0: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
48c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
48d0: 20 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61   Query the BtSha
48e0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
48f0: 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  vector..**.** Th
4900: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
4910: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65  alled when a fre
4920: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4930: 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
4940: 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73   the.** free-lis
4950: 74 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20  t for reuse. It 
4960: 72 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66  returns false if
4970: 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72   it is safe to r
4980: 65 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70  etrieve the.** p
4990: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
49a0: 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68  er layer with th
49b0: 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66  e 'no-content' f
49c0: 6c 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74  lag set. True ot
49d0: 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
49e0: 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48  ic int btreeGetH
49f0: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
4a00: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
4a10: 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70  no){.  Bitvec *p
4a20: 20 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74   = pBt->pHasCont
4a30: 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  ent;.  return (p
4a40: 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65   && (pgno>sqlite
4a50: 33 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c  3BitvecSize(p) |
4a60: 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
4a70: 65 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a  est(p, pgno)));.
4a80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28  }../*.** Clear (
4a90: 64 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53  destroy) the BtS
4aa0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4ab0: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73  t bitvec. This s
4ac0: 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f  hould be.** invo
4ad0: 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  ked at the concl
4ae0: 75 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72  usion of each wr
4af0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite-transaction.
4b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4b10: 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
4b20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4b30: 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69  Bt){.  sqlite3Bi
4b40: 74 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d  tvecDestroy(pBt-
4b50: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20  >pHasContent);. 
4b60: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
4b70: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
4b80: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
4b90: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
4ba0: 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65   in the variable
4bb0: 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20  s BtCursor.nKey 
4bc0: 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72  .** and BtCursor
4bd0: 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f  .pKey. The curso
4be0: 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74  r's state is set
4bf0: 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49   to CURSOR_REQUI
4c00: 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68  RESEEK..**.** Th
4c10: 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
4c20: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
4c30: 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68  rsor is valid (h
4c40: 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  as eState==CURSO
4c50: 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f  R_VALID).** prio
4c60: 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
4c70: 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a  s routine.  .*/.
4c80: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
4c90: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
4ca0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
4cb0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
4cc0: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
4cd0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
4ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
4cf0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
4d00: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
4d10: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
4d20: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
4d30: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
4d40: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
4d50: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
4d60: 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20  QLITE_OK );  /* 
4d70: 4b 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74  KeySize() cannot
4d80: 20 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49   fail */..  /* I
4d90: 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74  f this is an int
4da0: 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  Key table, then 
4db0: 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74  the above call t
4dc0: 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29  o BtreeKeySize()
4dd0: 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65  .  ** stores the
4de0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20   integer key in 
4df0: 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74  pCur->nKey. In t
4e00: 68 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61  his case this va
4e10: 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20  lue is.  ** all 
4e20: 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
4e30: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
4e40: 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e  pCur is not open
4e50: 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20   on an intKey.  
4e60: 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d  ** table, then m
4e70: 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20  alloc space for 
4e80: 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43  and store the pC
4e90: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f  ur->nKey bytes o
4ea0: 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61  f key .  ** data
4eb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d  ..  */.  if( 0==
4ec0: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
4ed0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76  >intKey ){.    v
4ee0: 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69  oid *pKey = sqli
4ef0: 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29  te3Malloc( (int)
4f00: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
4f10: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
4f20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4f30: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
4f40: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
4f50: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
4f60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4f70: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
4f80: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
4f90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
4fb0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
4fc0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4fd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
4fe0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
4ff0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5000: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5010: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5020: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5030: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5040: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
5050: 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
5060: 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
5070: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
5080: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
5090: 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
50a0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
50b0: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
50c0: 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65   -1;.    pCur->e
50d0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52  State = CURSOR_R
50e0: 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a  EQUIRESEEK;.  }.
50f0: 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  .  invalidateOve
5100: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
5110: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5120: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5130: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5140: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5150: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5160: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5170: 68 65 20 74 61 62 6c 65 20 20 77 69 74 68 20 72  he table  with r
5180: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
5190: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
51a0: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
51b0: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
51c0: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
51d0: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
51e0: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
51f0: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
5200: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
5210: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
5220: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
5230: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
5240: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
5250: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
5260: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5270: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5280: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5290: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
52a0: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
52b0: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
52c0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
52d0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
52e0: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
52f0: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
5300: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
5310: 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20  oot) && .       
5320: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
5330: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
5340: 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43    int rc = saveC
5350: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
5360: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
5370: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
5380: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
5390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
53a0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
53b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
53c0: 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74  lear the current
53d0: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
53e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
53f0: 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
5400: 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
5410: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
5420: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5430: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
5440: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
5450: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  );.  pCur->pKey 
5460: 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  = 0;.  pCur->eSt
5470: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
5480: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ALID;.}../*.** I
5490: 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  n this version o
54a0: 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70  f BtreeMoveto, p
54b0: 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20  Key is a packed 
54c0: 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20  index record.** 
54d0: 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72  such as is gener
54e0: 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
54f0: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
5500: 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a  .  Unpack the.**
5510: 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e   record and then
5520: 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74   call BtreeMovet
5530: 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64  oUnpacked() to d
5540: 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73  o the work..*/.s
5550: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 4d  tatic int btreeM
5560: 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f  oveto(.  BtCurso
5570: 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20  r *pCur,     /* 
5580: 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  Cursor open on t
5590: 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73  he btree to be s
55a0: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e  earched */.  con
55b0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20  st void *pKey,  
55c0: 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69   /* Packed key i
55d0: 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
55e0: 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34  n index */.  i64
55f0: 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
5600: 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20   /* Integer key 
5610: 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a  for tables.  Siz
5620: 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e  e of pKey for in
5630: 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62  dices */.  int b
5640: 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ias,           /
5650: 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f  * Bias search to
5660: 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
5670: 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
5680: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
5690: 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
56a0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
56b0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
56c0: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
56d0: 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63   code */.  Unpac
56e0: 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
56f0: 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65  ey;   /* Unpacke
5700: 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  d index key */. 
5710: 20 63 68 61 72 20 61 53 70 61 63 65 5b 31 35 30   char aSpace[150
5720: 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ];          /* T
5730: 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49  emp space for pI
5740: 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64  dxKey - to avoid
5750: 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63   a malloc */.  c
5760: 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a  har *pFree = 0;.
5770: 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
5780: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
5790: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
57a0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
57b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
57c0: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
57d0: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
57e0: 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65 2c  KeyInfo, aSpace,
57f0: 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29 2c   sizeof(aSpace),
5800: 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a 20   &pFree.    );. 
5810: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
5820: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
5830: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 71 6c  E_NOMEM;.    sql
5840: 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
5850: 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
5860: 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
5870: 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  pKey, pIdxKey);.
5880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
5890: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
58a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
58b0: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
58c0: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
58d0: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
58e0: 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ;.  if( pFree ){
58f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
5900: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
5910: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
5920: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
5930: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
5940: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
5950: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
5960: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
5970: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
5980: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
5990: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
59a0: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
59b0: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
59c0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
59d0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
59e0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
59f0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
5a00: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
5a10: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
5a20: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
5a30: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
5a40: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
5a50: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
5a60: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
5a70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
5a80: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
5a90: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
5aa0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
5ab0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  c;.  assert( cur
5ac0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5ad0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
5ae0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
5af0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
5b00: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
5b10: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
5b20: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
5b30: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
5b40: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
5b50: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5b60: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
5b70: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
5b80: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
5b90: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
5ba0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b 0a 20  ur->skipNext);. 
5bb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5bc0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
5bd0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
5be0: 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b  y);.    pCur->pK
5bf0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  ey = 0;.    asse
5c00: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
5c10: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
5c20: 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
5c30: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
5c40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5c50: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
5c60: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5c70: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
5c80: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
5c90: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
5ca0: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
5cb0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5cc0: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
5cd0: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
5ce0: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
5cf0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
5d00: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
5d10: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
5d20: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
5d30: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
5d40: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
5d50: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
5d60: 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  are pointing.** 
5d70: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
5d80: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
5d90: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  m..**.** This ro
5da0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e  utine returns an
5db0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73   error code if s
5dc0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5dd0: 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74  ong.  The.** int
5de0: 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20  eger *pHasMoved 
5df0: 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66  is set to one if
5e00: 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
5e10: 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e  moved and 0 if n
5e20: 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ot..*/.int sqlit
5e30: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
5e40: 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a  Moved(BtCursor *
5e50: 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d  pCur, int *pHasM
5e60: 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b  oved){.  int rc;
5e70: 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ..  rc = restore
5e80: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
5e90: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
5ea0: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5eb0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
5ec0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
5ed0: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
5ee0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
5ef0: 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 30 20 29  r->skipNext!=0 )
5f00: 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64  {.    *pHasMoved
5f10: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
5f20: 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20     *pHasMoved = 
5f30: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5f40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
5f50: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5f60: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
5f70: 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20  ** Given a page 
5f80: 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75  number of a regu
5f90: 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67  lar database pag
5fa0: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61  e, return the pa
5fb0: 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72  ge.** number for
5fc0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
5fd0: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
5fe0: 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f  ins the entry fo
5ff0: 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70  r the.** input p
6000: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  age number..**.*
6010: 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20  * Return 0 (not 
6020: 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f  a valid page) fo
6030: 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20  r pgno==1 since 
6040: 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70  there is.** no p
6050: 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63  ointer map assoc
6060: 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
6070: 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74  1.  The integrit
6080: 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a  y_check logic.**
6090: 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70   requires that p
60a0: 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29  trmapPageno(*,1)
60b0: 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  !=1..*/.static P
60c0: 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  gno ptrmapPageno
60d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
60e0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
60f0: 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  t nPagesPerMapPa
6100: 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d  ge;.  Pgno iPtrM
6110: 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72  ap, ret;.  asser
6120: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6130: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
6140: 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c  ) );.  if( pgno<
6150: 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  2 ) return 0;.  
6160: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6170: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
6180: 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72  ize/5)+1;.  iPtr
6190: 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e  Map = (pgno-2)/n
61a0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b  PagesPerMapPage;
61b0: 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61  .  ret = (iPtrMa
61c0: 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  p*nPagesPerMapPa
61d0: 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20  ge) + 2; .  if( 
61e0: 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ret==PENDING_BYT
61f0: 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
6200: 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20     ret++;.  }.  
6210: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
6220: 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e  *.** Write an en
6230: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
6240: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
6250: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64  This routine upd
6260: 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ates the pointer
6270: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6280: 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27  age number 'key'
6290: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d  .** so that it m
62a0: 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79  aps to type 'eTy
62b0: 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70  pe' and parent p
62c0: 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f  age number 'pgno
62d0: 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43  '..**.** If *pRC
62e0: 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f   is initially no
62f0: 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49  n-zero (non-SQLI
6300: 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73  TE_OK) then this
6310: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61   routine is.** a
6320: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65   no-op.  If an e
6330: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
6340: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6350: 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74  or code is writt
6360: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e  en.** into *pRC.
6370: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6380: 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72  ptrmapPut(BtShar
6390: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
63a0: 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e  y, u8 eType, Pgn
63b0: 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70  o parent, int *p
63c0: 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  RC){.  DbPage *p
63d0: 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20  DbPage;  /* The 
63e0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
63f0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
6400: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  p;      /* The p
6410: 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20  ointer map data 
6420: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61  */.  Pgno iPtrma
6430: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  p;     /* The po
6440: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e  inter map page n
6450: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f  umber */.  int o
6460: 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  ffset;       /* 
6470: 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65  Offset in pointe
6480: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6490: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
64a0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
64b0: 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f   from subfunctio
64c0: 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ns */..  if( *pR
64d0: 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
64e0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
64f0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
6500: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
6510: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
6520: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
6530: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
6540: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
6550: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
6560: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
6570: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
6580: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
6590: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
65a0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
65b0: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
65c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
65d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
65e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
65f0: 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  }.  iPtrmap = PT
6600: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
6610: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
6620: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
6630: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
6640: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
6650: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6660: 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
6670: 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   rc;.    return;
6680: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
6690: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
66a0: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
66b0: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
66c0: 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c  {.    *pRC = SQL
66d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
66e0: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61  ;.    goto ptrma
66f0: 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73  p_exit;.  }.  as
6700: 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20  sert( offset <= 
6710: 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65  (int)pBt->usable
6720: 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72  Size-5 );.  pPtr
6730: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
6740: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6750: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28  pDbPage);..  if(
6760: 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b   eType!=pPtrmap[
6770: 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62  offset] || get4b
6780: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6790: 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20  set+1])!=parent 
67a0: 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50  ){.    TRACE(("P
67b0: 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64  TRMAP_UPDATE: %d
67c0: 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65  ->(%d,%d)\n", ke
67d0: 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74  y, eType, parent
67e0: 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63  ));.    *pRC= rc
67f0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
6800: 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20  rite(pDbPage);. 
6810: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6820: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
6830: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20  trmap[offset] = 
6840: 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74  eType;.      put
6850: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6860: 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74  ffset+1], parent
6870: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74  );.    }.  }..pt
6880: 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c  rmap_exit:.  sql
6890: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
68a0: 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
68b0: 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20  * Read an entry 
68c0: 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72  from the pointer
68d0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
68e0: 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76   routine retriev
68f0: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6900: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6910: 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67  e 'key', writing
6920: 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64  .** the type and
6930: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
6940: 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61  ber to *pEType a
6950: 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63  nd *pPgno respec
6960: 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72  tively..** An er
6970: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6980: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
6990: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
69a0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
69b0: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
69c0: 20 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61   ptrmapGet(BtSha
69d0: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
69e0: 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20  ey, u8 *pEType, 
69f0: 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20  Pgno *pPgno){.  
6a00: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
6a10: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
6a20: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
6a30: 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20  int iPtrmap;    
6a40: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
6a50: 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a  p page index */.
6a60: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
6a70: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6a80: 6d 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f  map page data */
6a90: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
6aa0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
6ab0: 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e  of entry in poin
6ac0: 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74  ter map */.  int
6ad0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
6ae0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6af0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
6b00: 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50  ;..  iPtrmap = P
6b10: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
6b20: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
6b30: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
6b40: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
6b50: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
6b60: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
6b70: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
6b80: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
6b90: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
6ba0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
6bb0: 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54  ;..  offset = PT
6bc0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
6bd0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
6be0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
6bf0: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
6c00: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
6c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6c20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6c30: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
6c40: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
6c50: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
6c60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 54 79  ;.  assert( pETy
6c70: 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79  pe!=0 );.  *pETy
6c80: 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66  pe = pPtrmap[off
6c90: 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e  set];.  if( pPgn
6ca0: 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74  o ) *pPgno = get
6cb0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
6cc0: 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71  ffset+1]);..  sq
6cd0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
6ce0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
6cf0: 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45  *pEType<1 || *pE
6d00: 54 79 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20  Type>5 ) return 
6d10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6d20: 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  KPT;.  return SQ
6d30: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
6d40: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
6d50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
6d60: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
6d70: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
6d80: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
6d90: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
6da0: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
6db0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
6dc0: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
6dd0: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
6de0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
6df0: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
6e00: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
6e10: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
6e20: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
6e30: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
6e40: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
6e50: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
6e60: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
6e70: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
6e80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6e90: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
6ea0: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
6eb0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
6ec0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
6ed0: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
6ee0: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
6ef0: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
6f00: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
6f10: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
6f20: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
6f30: 65 20 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d  e findCellv2(D,M
6f40: 2c 4f 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32  ,O,I) (D+(M&get2
6f50: 62 79 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29  byte(D+(O+2*(I))
6f60: 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ))).../*.** This
6f70: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
6f80: 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43  version of findC
6f90: 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73  ell() that works
6fa0: 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68   for.** pages th
6fb0: 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76  at do contain ov
6fc0: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
6fd0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
6fe0: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
6ff0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
7000: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
7010: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7020: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7030: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
7040: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
7050: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
7060: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
7070: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75   int k;.    stru
7080: 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f  ct _OvflCell *pO
7090: 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d  vfl;.    pOvfl =
70a0: 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69   &pPage->aOvfl[i
70b0: 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c  ];.    k = pOvfl
70c0: 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b  ->idx;.    if( k
70d0: 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  <=iCell ){.     
70e0: 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b   if( k==iCell ){
70f0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
7100: 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20  pOvfl->pCell;.  
7110: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
7120: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
7130: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
7140: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
7150: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
7160: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
7170: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
7180: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
7190: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
71a0: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
71b0: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
71c0: 69 6f 6e 2e 20 20 62 74 72 65 65 50 61 72 73 65  ion.  btreeParse
71d0: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
71e0: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
71f0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
7200: 6d 65 6e 74 20 61 6e 64 20 62 74 72 65 65 50 61  ment and btreePa
7210: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
7220: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
7230: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
7240: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
7250: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
7260: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
7270: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
7280: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
7290: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
72a0: 74 65 61 64 20 6f 66 0a 2a 2a 20 62 74 72 65 65  tead of.** btree
72b0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20  ParseCellPtr(). 
72c0: 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69  Using some compi
72d0: 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  lers, this will 
72e0: 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 73 74  be faster..*/.st
72f0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
7300: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
7310: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
7320: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
7330: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
7340: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
7350: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
7360: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
7370: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
7380: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
7390: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
73a0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
73b0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  ure */.){.  u16 
73c0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
73d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79      /* Number by
73e0: 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74  tes in cell cont
73f0: 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ent header */.  
7400: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
7410: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7420: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
7430: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
7440: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7450: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
7460: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
7470: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c  ;..  pInfo->pCel
7480: 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73  l = pCell;.  ass
7490: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
74a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
74b0: 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70  af==1 );.  n = p
74c0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
74d0: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ze;.  assert( n=
74e0: 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66  =4-4*pPage->leaf
74f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
7500: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69  >intKey ){.    i
7510: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
7520: 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  a ){.      n += 
7530: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
7540: 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ll[n], nPayload)
7550: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7560: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
7570: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
7580: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
7590: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
75a0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
75b0: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
75c0: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
75d0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
75e0: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
75f0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
7600: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
7610: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
7620: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
7630: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
7640: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
7650: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
7660: 3d 20 6e 3b 0a 20 20 74 65 73 74 63 61 73 65 28  = n;.  testcase(
7670: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
7680: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
7690: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
76a0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
76b0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6c  cal+1 );.  if( l
76c0: 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d  ikely(nPayload<=
76d0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29  pPage->maxLocal)
76e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
76f0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
7700: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
7710: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
7720: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
7730: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
7740: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
7750: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
7760: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 49 6e 66  */.    if( (pInf
7770: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
7780: 28 6e 2b 6e 50 61 79 6c 6f 61 64 29 29 3c 34 20  (n+nPayload))<4 
7790: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
77a0: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
77b0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
77c0: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
77d0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
77e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
77f0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
7800: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
7810: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
7820: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
7830: 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65 63  ve.    ** to dec
7840: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
7850: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
7860: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
7870: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20  ill onto.    ** 
7880: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
7890: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
78a0: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
78b0: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
78c0: 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 6f  d.    ** space o
78d0: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  n overflow pages
78e0: 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74   while keeping t
78f0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63  he amount of loc
7900: 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20 2a  al storage.    *
7910: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
7920: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
7930: 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  al..    **.    *
7940: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
7950: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
7960: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
7970: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
7980: 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20 77  any.    ** way w
7990: 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  ill result in an
79a0: 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69   incompatible fi
79b0: 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a  le format..    *
79c0: 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63  /.    int minLoc
79d0: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
79e0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
79f0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7a00: 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63  /.    int maxLoc
7a10: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
7a20: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
7a30: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
7a40: 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c 75  /.    int surplu
7a50: 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  s;   /* Overflow
7a60: 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62   payload availab
7a70: 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f  le for local sto
7a80: 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e  rage */..    min
7a90: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7aa0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78  inLocal;.    max
7ab0: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
7ac0: 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72  axLocal;.    sur
7ad0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
7ae0: 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69  + (nPayload - mi
7af0: 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e  nLocal)%(pPage->
7b00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7b10: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
7b20: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
7b30: 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
7b40: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
7b50: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
7b60: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
7b70: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
7b80: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
7b90: 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b   = (u16)surplus;
7ba0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7bb0: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
7bc0: 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b  = (u16)minLocal;
7bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
7be0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75  ->iOverflow = (u
7bf0: 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  16)(pInfo->nLoca
7c00: 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66  l + n);.    pInf
7c10: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f  o->nSize = pInfo
7c20: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b  ->iOverflow + 4;
7c30: 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70  .  }.}.#define p
7c40: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
7c50: 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a  iCell, pInfo) \.
7c60: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
7c70: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
7c80: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
7c90: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
7ca0: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  ).static void bt
7cb0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
7cc0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
7cd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7ce0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
7cf0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
7d00: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
7d10: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
7d20: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
7d30: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
7d40: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
7d50: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
7d60: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
7d70: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
7d80: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
7d90: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
7da0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
7db0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
7dc0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
7dd0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
7de0: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
7df0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
7e00: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
7e10: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
7e20: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
7e30: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
7e40: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
7e50: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
7e60: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
7e70: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
7e80: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
7e90: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
7ea0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
7eb0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
7ec0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
7ed0: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
7ee0: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
7ef0: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
7f00: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
7f10: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
7f20: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
7f30: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
7f40: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
7f50: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
7f60: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
7f70: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
7f80: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
7f90: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
7fa0: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
7fb0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
7fc0: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
7fd0: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
7fe0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
7ff0: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
8000: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
8010: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
8020: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
8030: 69 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72  info;.  btreePar
8040: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
8050: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
8060: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
8070: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
8080: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
8090: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
80a0: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
80b0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
80c0: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
80d0: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
80e0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
80f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8100: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
8110: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
8120: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
8130: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
8140: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
8150: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
8160: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
8170: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
8180: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
8190: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
81a0: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
81b0: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
81c0: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
81d0: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
81e0: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
81f0: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
8200: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
8210: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
8220: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
8230: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
8240: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
8250: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
8260: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
8270: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
8280: 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65   if( nSize>pPage
8290: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
82a0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
82b0: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
82c0: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
82d0: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
82e0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
82f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8300: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
8310: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
8320: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
8330: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
8340: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
8350: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8360: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
8370: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
8380: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
8390: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
83a0: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
83b0: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
83c0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
83d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
83e0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
83f0: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
8400: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
8410: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
8420: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
8430: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
8440: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
8450: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
8460: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
8470: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
8480: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
8490: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
84a0: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
84b0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
84c0: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
84d0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
84e0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
84f0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
8500: 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50  return cellSizeP
8510: 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65  tr(pPage, findCe
8520: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
8530: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
8540: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8550: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
8560: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43  * If the cell pC
8570: 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67  ell, part of pag
8580: 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  e pPage contains
8590: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
85a0: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
85b0: 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74  e, insert an ent
85c0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
85d0: 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74  ter-map.** for t
85e0: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
85f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8600: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8610: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
8620: 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74  , u8 *pCell, int
8630: 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e   *pRC){.  CellIn
8640: 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a  fo info;.  if( *
8650: 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pRC ) return;.  
8660: 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30  assert( pCell!=0
8670: 20 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65   );.  btreeParse
8680: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
8690: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
86a0: 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
86b0: 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
86c0: 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
86d0: 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
86e0: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
86f0: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 50  verflow ){.    P
8700: 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62  gno ovfl = get4b
8710: 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
8720: 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
8730: 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65   ptrmapPut(pPage
8740: 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52  ->pBt, ovfl, PTR
8750: 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70  MAP_OVERFLOW1, p
8760: 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29  Page->pgno, pRC)
8770: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
8780: 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e  ./*.** Defragmen
8790: 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  t the page given
87a0: 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65  .  All Cells are
87b0: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a   moved to the.**
87c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
87d0: 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70   and all free sp
87e0: 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64  ace is collected
87f0: 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67   into one.** big
8800: 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63   FreeBlk that oc
8810: 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20  curs in between 
8820: 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20 63  the header and c
8830: 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61  ell.** pointer a
8840: 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c  rray and the cel
8850: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a  l content area..
8860: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
8870: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d  fragmentPage(Mem
8880: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
8890: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
88a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
88b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
88c0: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
88d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
88e0: 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20  dress of a i-th 
88f0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
8900: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
8910: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
8920: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
8930: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
8960: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
8970: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
8980: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8990: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
89a0: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
89b0: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
89c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
89d0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
89e0: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
89f0: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
8a10: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
8a20: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
8a30: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8a50: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
8a60: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
8a70: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
8a80: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
8a90: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
8aa0: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
8ab0: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
8ac0: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
8ad0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
8ae0: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
8af0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8b00: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
8b10: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
8b20: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
8b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
8b40: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
8b50: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
8b60: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8b70: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
8b80: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
8b90: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8ba0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
8bb0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8bc0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
8bd0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
8be0: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
8bf0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
8c00: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
8c10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8c20: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8c30: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
8c40: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
8c50: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
8c60: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
8c70: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
8c80: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
8c90: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
8ca0: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
8cb0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
8cc0: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
8cd0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
8ce0: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
8cf0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
8d00: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
8d10: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
8d20: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63  >usableSize;.  c
8d30: 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
8d40: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
8d50: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72  memcpy(&temp[cbr
8d60: 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c  k], &data[cbrk],
8d70: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62   usableSize - cb
8d80: 72 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73  rk);.  cbrk = us
8d90: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65 6c  ableSize;.  iCel
8da0: 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66  lFirst = cellOff
8db0: 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20  set + 2*nCell;. 
8dc0: 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61   iCellLast = usa
8dd0: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66  bleSize - 4;.  f
8de0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
8df0: 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
8e00: 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65  Addr;     /* The
8e10: 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74   i-th cell point
8e20: 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20  er */.    pAddr 
8e30: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
8e40: 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70  et + i*2];.    p
8e50: 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64  c = get2byte(pAd
8e60: 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  dr);.    testcas
8e70: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73  e( pc==iCellFirs
8e80: 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  t );.    testcas
8e90: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
8ea0: 20 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   );.#if !defined
8eb0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
8ec0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
8ed0: 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68 65 73 65  CK).    /* These
8ee0: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65   conditions have
8ef0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65   already been ve
8f00: 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65 49  rified in btreeI
8f10: 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a  nitPage().    **
8f20: 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   if SQLITE_ENABL
8f30: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
8f40: 43 48 45 43 4b 20 69 73 20 64 65 66 69 6e 65 64  CHECK is defined
8f50: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
8f60: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
8f70: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
8f80: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
8f90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
8fa0: 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  PT;.    }.#endif
8fb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
8fc0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
8fd0: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
8fe0: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
8ff0: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
9000: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  emp[pc]);.    cb
9010: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69 66 20  rk -= size;.#if 
9020: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
9030: 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43  NABLE_OVERSIZE_C
9040: 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 69  ELL_CHECK).    i
9050: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
9060: 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  st ){.      retu
9070: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9080: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65  T_BKPT;.    }.#e
9090: 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62 72 6b  lse.    if( cbrk
90a0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
90b0: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
90c0: 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
90d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
90e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
90f0: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
9100: 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c  cbrk+size<=usabl
9110: 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69  eSize && cbrk>=i
9120: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20  CellFirst );.   
9130: 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b   testcase( cbrk+
9140: 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65  size==usableSize
9150: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
9160: 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  ( pc+size==usabl
9170: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d  eSize );.    mem
9180: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
9190: 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65   &temp[pc], size
91a0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
91b0: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
91c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
91d0: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
91e0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
91f0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
9200: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
9210: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
9220: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
9230: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
9240: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
9250: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
9260: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
9270: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
9280: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
9290: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
92a0: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
92b0: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
92c0: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
92d0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
92e0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
92f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9300: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
9310: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
9320: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
9330: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
9340: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
9350: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
9360: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
9370: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
9380: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
9390: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
93a0: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
93b0: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
93c0: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
93d0: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
93e0: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
93f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
9400: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
9410: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
9420: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
9430: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
9440: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
9450: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
9460: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
9470: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
9480: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
9490: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
94a0: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
94b0: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
94c0: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
94d0: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
94e0: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
94f0: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
9500: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
9510: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
9520: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
9530: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
9540: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
9550: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
9560: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
9570: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
9580: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
9590: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
95a0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
95b0: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
95c0: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
95d0: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
95e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
95f0: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
9600: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
9610: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
9620: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
9630: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
9640: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
9650: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
9660: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b   */.  int nFrag;
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9690: 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74  mber of fragment
96a0: 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67  ed bytes on pPag
96b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20  e */.  int top; 
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
96e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c  irst byte of cel
96f0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
9700: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
9710: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
9720: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
9730: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
9740: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
9750: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
9760: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
9770: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
9780: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
9790: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
97a0: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
97b0: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
97c0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
97d0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
97e0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
97f0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
9800: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9810: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9820: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9830: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
9840: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
9850: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
9860: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
9870: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
9880: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
9890: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
98a0: 77 3d 3d 30 20 29 3b 0a 20 20 75 73 61 62 6c 65  w==0 );.  usable
98b0: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
98c0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
98d0: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
98e0: 20 75 73 61 62 6c 65 53 69 7a 65 2d 38 20 29 3b   usableSize-8 );
98f0: 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74 61  ..  nFrag = data
9900: 5b 68 64 72 2b 37 5d 3b 0a 20 20 61 73 73 65 72  [hdr+7];.  asser
9910: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
9920: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
9930: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
9940: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
9950: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
9960: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
9970: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9980: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
9990: 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20 67 61 70  r+5]);.  if( gap
99a0: 3e 74 6f 70 20 29 20 72 65 74 75 72 6e 20 53 51  >top ) return SQ
99b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
99c0: 54 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  T;.  testcase( g
99d0: 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+2==top );.  t
99e0: 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d  estcase( gap+1==
99f0: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
9a00: 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a  e( gap==top );..
9a10: 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20    if( nFrag>=60 
9a20: 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  ){.    /* Always
9a30: 20 64 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68   defragment high
9a40: 6c 79 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61  ly fragmented pa
9a50: 67 65 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ges */.    rc = 
9a60: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
9a70: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
9a80: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9a90: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
9aa0: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
9ab0: 64 72 2b 35 5d 29 3b 0a 20 20 7d 65 6c 73 65 20  dr+5]);.  }else 
9ac0: 69 66 28 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29  if( gap+2<=top )
9ad0: 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20  {.    /* Search 
9ae0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f  the freelist loo
9af0: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
9b00: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
9b10: 74 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20  to satisfy .    
9b20: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20  ** the request. 
9b30: 54 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  The allocation i
9b40: 73 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20  s made from the 
9b50: 66 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20  first free slot 
9b60: 69 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  in .    ** the l
9b70: 69 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67  ist that is larg
9b80: 65 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f  e enough to acco
9b90: 6d 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a  madate it..    *
9ba0: 2f 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64  /.    int pc, ad
9bb0: 64 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72  dr;.    for(addr
9bc0: 3d 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65  =hdr+1; (pc = ge
9bd0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
9be0: 72 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29  r]))>0; addr=pc)
9bf0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65  {.      int size
9c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9c10: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
9c20: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69   slot */.      i
9c30: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
9c40: 2d 34 20 7c 7c 20 70 63 3c 61 64 64 72 2b 34 20  -4 || pc<addr+4 
9c50: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
9c60: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9c70: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
9c80: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
9c90: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
9ca0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
9cb0: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
9cc0: 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65      int x = size
9cd0: 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   - nByte;.      
9ce0: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
9cf0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
9d00: 63 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20  case( x==3 );.  
9d10: 20 20 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b        if( x<4 ){
9d20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  .          /* Re
9d30: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
9d40: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
9d50: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
9d60: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ber of.         
9d70: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
9d80: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
9d90: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
9da0: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
9db0: 61 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d  addr], &data[pc]
9dc0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 2);.          
9dd0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75  data[hdr+7] = (u
9de0: 38 29 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20  8)(nFrag + x);. 
9df0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9e00: 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c   size+pc > usabl
9e10: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
9e20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9e30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9e40: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9e50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
9e60: 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74  lot remains on t
9e70: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65  he free-list. Re
9e80: 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f  duce its size to
9e90: 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20   account.       
9ea0: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
9eb0: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
9ec0: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
9ed0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
9ee0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  ut2byte(&data[pc
9ef0: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20  +2], x);.       
9f00: 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 49 64 78   }.        *pIdx
9f10: 20 3d 20 70 63 20 2b 20 78 3b 0a 20 20 20 20 20   = pc + x;.     
9f20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9f30: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
9f40: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
9f50: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
9f60: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
9f70: 73 70 61 63 65 20 69 6e 20 74 68 65 20 67 61 70  space in the gap
9f80: 20 74 6f 20 73 61 74 69 73 66 79 0a 20 20 2a 2a   to satisfy.  **
9f90: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e   the allocation.
9fa0: 20 20 49 66 20 6e 6f 74 2c 20 64 65 66 72 61 67    If not, defrag
9fb0: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  ment..  */.  tes
9fc0: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
9fd0: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
9fe0: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
9ff0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 65 66   ){.    rc = def
a000: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
a010: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
a020: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
a030: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f  top = get2byteNo
a040: 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b  tZero(&data[hdr+
a050: 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  5]);.    assert(
a060: 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20   gap+nByte<=top 
a070: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
a080: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
a090: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
a0a0: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
a0b0: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
a0c0: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
a0d0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
a0e0: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
a0f0: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
a100: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
a110: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
a120: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
a130: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
a140: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
a150: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
a160: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
a170: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
a180: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
a190: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
a1a0: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
a1b0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
a1c0: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
a1d0: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
a1e0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
a1f0: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
a200: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
a210: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
a220: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
a230: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
a240: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
a250: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
a260: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
a270: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
a280: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
a290: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
a2a0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
a2b0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
a2c0: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
a2d0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
a2e0: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
a2f0: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
a300: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
a310: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
a320: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
a330: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
a340: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
a350: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
a360: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
a370: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
a380: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
a390: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
a3a0: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
a3b0: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
a3c0: 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c 61 73 74  hdr;.  int iLast
a3d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a3e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67           /* Larg
a3f0: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65  est possible fre
a400: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
a410: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a420: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
a430: 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  aData;..  assert
a440: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
a450: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
a460: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
a470: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
a480: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
a490: 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e  ( start>=pPage->
a4a0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
a4b0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
a4c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
a4d0: 61 72 74 20 2b 20 73 69 7a 65 29 20 3c 3d 20 28  art + size) <= (
a4e0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
a4f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
a500: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a510: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
a520: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
a530: 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e  .  assert( size>
a540: 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =0 );   /* Minim
a550: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
a560: 34 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67  4 */..  if( pPag
a570: 65 2d 3e 70 42 74 2d 3e 73 65 63 75 72 65 44 65  e->pBt->secureDe
a580: 6c 65 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  lete ){.    /* O
a590: 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
a5a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
a5b0: 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65  h zeros when the
a5c0: 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20   secure_delete. 
a5d0: 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20     ** option is 
a5e0: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  enabled */.    m
a5f0: 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72  emset(&data[star
a600: 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 20 20  t], 0, size);.  
a610: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  }..  /* Add the 
a620: 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20  space back into 
a630: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
a640: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20  of freeblocks.  
a650: 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a 20 65  Note that.  ** e
a660: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
a670: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
a680: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
a690: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 20 20  eeInitPage(),.  
a6a0: 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  ** btreeInitPage
a6b0: 28 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63  () did not detec
a6c0: 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 63 65  t overlapping ce
a6d0: 6c 6c 73 20 6f 72 0a 20 20 2a 2a 20 66 72 65 65  lls or.  ** free
a6e0: 62 6c 6f 63 6b 73 20 74 68 61 74 20 6f 76 65 72  blocks that over
a6f0: 6c 61 70 70 65 64 20 63 65 6c 6c 73 2e 20 20 20  lapped cells.   
a700: 4e 6f 72 20 64 6f 65 73 20 69 74 20 64 65 74 65  Nor does it dete
a710: 63 74 20 77 68 65 6e 20 74 68 65 0a 20 20 2a 2a  ct when the.  **
a720: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
a730: 65 61 20 65 78 63 65 65 64 73 20 74 68 65 20 76  ea exceeds the v
a740: 61 6c 75 65 20 69 6e 20 74 68 65 20 70 61 67 65  alue in the page
a750: 20 68 65 61 64 65 72 2e 20 20 49 66 20 74 68 65   header.  If the
a760: 73 65 0a 20 20 2a 2a 20 73 69 74 75 61 74 69 6f  se.  ** situatio
a770: 6e 73 20 61 72 69 73 65 2c 20 74 68 65 6e 20 73  ns arise, then s
a780: 75 62 73 65 71 75 65 6e 74 20 69 6e 73 65 72 74  ubsequent insert
a790: 20 6f 70 65 72 61 74 69 6f 6e 73 20 6d 69 67 68   operations migh
a7a0: 74 20 63 6f 72 72 75 70 74 0a 20 20 2a 2a 20 74  t corrupt.  ** t
a7b0: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 53 6f  he freelist.  So
a7c0: 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20 63   we do need to c
a7d0: 68 65 63 6b 20 66 6f 72 20 63 6f 72 72 75 70 74  heck for corrupt
a7e0: 69 6f 6e 20 77 68 69 6c 65 20 73 63 61 6e 6e 69  ion while scanni
a7f0: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 72 65 65  ng.  ** the free
a800: 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  list..  */.  hdr
a810: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
a820: 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64  set;.  addr = hd
a830: 72 20 2b 20 31 3b 0a 20 20 69 4c 61 73 74 20 3d  r + 1;.  iLast =
a840: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
a850: 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 61  bleSize - 4;.  a
a860: 73 73 65 72 74 28 20 73 74 61 72 74 3c 3d 69 4c  ssert( start<=iL
a870: 61 73 74 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ast );.  while( 
a880: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
a890: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
a8a0: 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e  <start && pbegin
a8b0: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 62  >0 ){.    if( pb
a8c0: 65 67 69 6e 3c 61 64 64 72 2b 34 20 29 7b 0a 20  egin<addr+4 ){. 
a8d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
a8e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
a8f0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 64 64 72 20  .    }.    addr 
a900: 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20  = pbegin;.  }.  
a910: 69 66 28 20 70 62 65 67 69 6e 3e 69 4c 61 73 74  if( pbegin>iLast
a920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
a930: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a940: 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  PT;.  }.  assert
a950: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c  ( pbegin>addr ||
a960: 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20   pbegin==0 );.  
a970: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 61  put2byte(&data[a
a980: 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20  ddr], start);.  
a990: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
a9a0: 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a  tart], pbegin);.
a9b0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a9c0: 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29  [start+2], size)
a9d0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
a9e0: 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20   = pPage->nFree 
a9f0: 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20  + (u16)size;..  
aa00: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
aa10: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
aa20: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 68 64 72   */.  addr = hdr
aa30: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
aa40: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
aa50: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
aa60: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
aa70: 78 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20  xt, psize, x;.  
aa80: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
aa90: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73  >addr );.    ass
aaa0: 65 72 74 28 20 70 62 65 67 69 6e 20 3c 3d 20 28  ert( pbegin <= (
aab0: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
aac0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a  usableSize-4 );.
aad0: 20 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32      pnext = get2
aae0: 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69  byte(&data[pbegi
aaf0: 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d  n]);.    psize =
ab00: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
ab10: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
ab20: 69 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69  if( pbegin + psi
ab30: 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20  ze + 3 >= pnext 
ab40: 26 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20  && pnext>0 ){.  
ab50: 20 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70      int frag = p
ab60: 6e 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70  next - (pbegin+p
ab70: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  size);.      if(
ab80: 20 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72   (frag<0) || (fr
ab90: 61 67 3e 28 69 6e 74 29 64 61 74 61 5b 68 64 72  ag>(int)data[hdr
aba0: 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  +7]) ){.        
abb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
abc0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
abd0: 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b 68    }.      data[h
abe0: 64 72 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61  dr+7] -= (u8)fra
abf0: 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74  g;.      x = get
ac00: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
ac10: 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62  t]);.      put2b
ac20: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
ac30: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d  ], x);.      x =
ac40: 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74   pnext + get2byt
ac50: 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d  e(&data[pnext+2]
ac60: 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  ) - pbegin;.    
ac70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ac80: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a  [pbegin+2], x);.
ac90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aca0: 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a   addr = pbegin;.
acb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
acc0: 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
acd0: 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73 20  ent area begins 
ace0: 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b  with a freeblock
acf0: 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a  , remove it. */.
ad00: 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31    if( data[hdr+1
ad10: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26  ]==data[hdr+5] &
ad20: 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64  & data[hdr+2]==d
ad30: 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20  ata[hdr+6] ){.  
ad40: 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70    int top;.    p
ad50: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
ad60: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
ad70: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
ad80: 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70  [hdr+1], &data[p
ad90: 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20  begin], 2);.    
ada0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
adb0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67  data[hdr+5]) + g
adc0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
add0: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75  egin+2]);.    pu
ade0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
adf0: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20  +5], top);.  }. 
ae00: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ae10: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
ae20: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ae30: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
ae40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ae50: 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67   Decode the flag
ae60: 73 20 62 79 74 65 20 28 74 68 65 20 66 69 72 73  s byte (the firs
ae70: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 68 65  t byte of the he
ae80: 61 64 65 72 29 20 66 6f 72 20 61 20 70 61 67 65  ader) for a page
ae90: 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  .** and initiali
aea0: 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ze fields of the
aeb0: 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74 75   MemPage structu
aec0: 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  re accordingly..
aed0: 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66  **.** Only the f
aee0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
aef0: 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72  tions are suppor
af00: 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64  ted.  Anything d
af10: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69  ifferent.** indi
af20: 63 61 74 65 73 20 61 20 63 6f 72 72 75 70 74 20  cates a corrupt 
af30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a  database files:.
af40: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  **.**         PT
af50: 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20  F_ZERODATA.**   
af60: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
af70: 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a  TA | PTF_LEAF.**
af80: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
af90: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
afa0: 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  EY.**         PT
afb0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
afc0: 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45  _INTKEY | PTF_LE
afd0: 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  AF.*/.static int
afe0: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d   decodeFlags(Mem
aff0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
b000: 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74   flagByte){.  Bt
b010: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
b020: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50   /* A copy of pP
b030: 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61  age->pBt */..  a
b040: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64  ssert( pPage->hd
b050: 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d  rOffset==(pPage-
b060: 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a  >pgno==1 ? 100 :
b070: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
b080: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b090: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
b0a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
b0b0: 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66  e->leaf = (u8)(f
b0c0: 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73  lagByte>>3);  as
b0d0: 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d  sert( PTF_LEAF =
b0e0: 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67  = 1<<3 );.  flag
b0f0: 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41  Byte &= ~PTF_LEA
b100: 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c  F;.  pPage->chil
b110: 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70  dPtrSize = 4-4*p
b120: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42  Page->leaf;.  pB
b130: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
b140: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
b150: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
b160: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
b170: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
b180: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 1;.    pPage-
b190: 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61 67 65  >hasData = pPage
b1a0: 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  ->leaf;.    pPag
b1b0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
b1c0: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
b1d0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
b1e0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
b1f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
b200: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
b210: 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  TA ){.    pPage-
b220: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
b230: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
b240: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
b250: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
b260: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50  maxLocal;.    pP
b270: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
b280: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  pBt->minLocal;. 
b290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
b2a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b2b0: 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
b2c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
b2d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
b2e0: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
b2f0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
b300: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
b310: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
b320: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
b330: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
b340: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
b350: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
b360: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
b370: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
b380: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
b390: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
b3a0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
b3b0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
b3c0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
b3d0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
b3e0: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
b3f0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
b400: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
b410: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
b420: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
b430: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
b440: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
b450: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
b460: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
b470: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
b480: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b490: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
b4a0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
b4b0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
b4c0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
b4d0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
b4e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
b4f0: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
b500: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
b510: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
b520: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b530: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
b540: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
b550: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
b560: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
b570: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
b580: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
b590: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b5a0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
b5b0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
b5c0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
b5d0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
b5e0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
b5f0: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
b600: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
b610: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
b620: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
b630: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
b640: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
b650: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
b660: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
b670: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
b680: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
b690: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
b6a0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
b6b0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
b6c0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
b6d0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
b6e0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
b6f0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
b700: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
b710: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
b720: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
b730: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
b740: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
b750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b760: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
b770: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
b780: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
b790: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
b7a0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
b7b0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
b7c0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
b7d0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
b7e0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
b7f0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
b800: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
b810: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
b820: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
b830: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
b840: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
b850: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69  ge->aData;.    i
b860: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
b870: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
b880: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
b890: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b8a0: 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
b8b0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
b8c0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
b8d0: 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61  65536 );.    pPa
b8e0: 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
b8f0: 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
b900: 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61  ze - 1);.    pPa
b910: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
b920: 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  0;.    usableSiz
b930: 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
b940: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ize;.    pPage->
b950: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c  cellOffset = cel
b960: 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20  lOffset = hdr + 
b970: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
b980: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  af;.    pPage->a
b990: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
b9a0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
b9b0: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
b9c0: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b9d0: 73 65 74 5d 3b 0a 20 20 20 20 74 6f 70 20 3d 20  set];.    top = 
b9e0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
b9f0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
ba00: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
ba10: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ba20: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
ba30: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
ba40: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
ba50: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
ba60: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
ba70: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
ba80: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
ba90: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
baa0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bab0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
bac0: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
bad0: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
bae0: 4c 28 70 42 74 29 20 29 3b 0a 0a 20 20 20 20 2f  L(pBt) );..    /
baf0: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
bb00: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
bb10: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
bb20: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
bb30: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
bb40: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
bb50: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
bb60: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
bb70: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
bb80: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
bb90: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
bba0: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
bbb0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
bbc0: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
bbd0: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
bbe0: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
bbf0: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
bc00: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
bc10: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
bc20: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
bc30: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
bc40: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
bc50: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 23  sableSize - 4;.#
bc60: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
bc70: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
bc80: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
bc90: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b    {.      int i;
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
bcb0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65  ndex into the ce
bcc0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
bcd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a   */.      int sz
bce0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
bcf0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
bd00: 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ..      if( !pPa
bd10: 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
bd20: 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f  Last--;.      fo
bd30: 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
bd40: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
bd50: 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79       pc = get2by
bd60: 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  te(&data[cellOff
bd70: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
bd80: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
bd90: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
bda0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
bdb0: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
bdc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
bdd0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
bde0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
bdf0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
be00: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
be10: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
be20: 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
be30: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26  SizePtr(pPage, &
be40: 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20  data[pc]);.     
be50: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b     testcase( pc+
be60: 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29  sz==usableSize )
be70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
be80: 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  +sz>usableSize )
be90: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
bea0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
beb0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
bec0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
bed0: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
bee0: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a   ) iCellLast++;.
bef0: 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a      }  .#endif..
bf00: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
bf10: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
bf20: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
bf30: 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  */.    pc = get2
bf40: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
bf50: 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20  ]);.    nFree = 
bf60: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
bf70: 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  p;.    while( pc
bf80: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
bf90: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
bfa0: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
bfb0: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
bfc0: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
bfd0: 2a 20 53 74 61 72 74 20 6f 66 20 66 72 65 65 20  * Start of free 
bfe0: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
bff0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
c000: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c010: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c020: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
c030: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c040: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
c050: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
c060: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
c070: 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26    if( (next>0 &&
c080: 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
c090: 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61  ) || pc+size>usa
c0a0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
c0b0: 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b     /* Free block
c0c0: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
c0d0: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e  ending order. An
c0e0: 64 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  d the last byte 
c0f0: 6f 66 0a 09 2a 2a 20 74 68 65 20 66 72 65 65 2d  of..** the free-
c100: 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f  block must lie o
c110: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  n the database p
c120: 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
c130: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c140: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
c150: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65      }.      nFre
c160: 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
c170: 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78  ;.      pc = nex
c180: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
c190: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
c1a0: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
c1b0: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
c1c0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
c1d0: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
c1e0: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
c1f0: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
c200: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
c210: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
c220: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
c230: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
c240: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
c250: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
c260: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
c270: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
c280: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
c290: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
c2a0: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
c2b0: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
c2c0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c2d0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
c2e0: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
c2f0: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
c300: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
c310: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
c320: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
c330: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
c340: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c350: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c360: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c370: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
c380: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
c390: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
c3a0: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
c3b0: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
c3c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c3d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c3e0: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
c3f0: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
c400: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
c410: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
c420: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
c430: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
c440: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
c450: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
c460: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
c470: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
c480: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
c490: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
c4a0: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
c4b0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c4c0: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
c4d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
c4e0: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
c4f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c500: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
c510: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c520: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
c530: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c540: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
c550: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c560: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
c570: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c580: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
c590: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c5a0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c5b0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c5c0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c5d0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
c5e0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
c5f0: 66 28 20 70 42 74 2d 3e 73 65 63 75 72 65 44 65  f( pBt->secureDe
c600: 6c 65 74 65 20 29 7b 0a 20 20 20 20 6d 65 6d 73  lete ){.    mems
c610: 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
c620: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
c630: 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
c640: 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
c650: 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
c660: 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28   = hdr + 8 + 4*(
c670: 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29  (flags&PTF_LEAF)
c680: 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d  ==0 ?1:0);.  mem
c690: 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  set(&data[hdr+1]
c6a0: 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b  , 0, 4);.  data[
c6b0: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75  hdr+7] = 0;.  pu
c6c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c6d0: 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65  +5], pBt->usable
c6e0: 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Size);.  pPage->
c6f0: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42  nFree = (u16)(pB
c700: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
c710: 66 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65  first);.  decode
c720: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61  Flags(pPage, fla
c730: 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64  gs);.  pPage->hd
c740: 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b 0a 20  rOffset = hdr;. 
c750: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
c760: 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
c770: 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
c780: 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
c790: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
c7a0: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
c7b0: 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
c7c0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
c7d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
c7e0: 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26  >pageSize>=512 &
c7f0: 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  & pBt->pageSize<
c800: 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67  =65536 );.  pPag
c810: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75  e->maskPage = (u
c820: 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  16)(pBt->pageSiz
c830: 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d  e - 1);.  pPage-
c840: 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50  >nCell = 0;.  pP
c850: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
c860: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
c870: 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61  rt a DbPage obta
c880: 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  ined from the pa
c890: 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61  ger into a MemPa
c8a0: 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ge used by.** th
c8b0: 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a  e btree layer..*
c8c0: 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
c8d0: 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44   *btreePageFromD
c8e0: 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44  bPage(DbPage *pD
c8f0: 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f  bPage, Pgno pgno
c900: 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  , BtShared *pBt)
c910: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
c920: 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73  ge = (MemPage*)s
c930: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
c940: 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  tra(pDbPage);.  
c950: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
c960: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
c970: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ta(pDbPage);.  p
c980: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
c990: 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65  pDbPage;.  pPage
c9a0: 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
c9b0: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
c9c0: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f  o;.  pPage->hdrO
c9d0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70  ffset = pPage->p
c9e0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
c9f0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
ca00: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
ca10: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
ca20: 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
ca30: 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
ca40: 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
ca50: 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
ca60: 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a   if needed..**.*
ca70: 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65  * If the noConte
ca80: 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  nt flag is set, 
ca90: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
caa0: 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f   do not care abo
cab0: 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  ut.** the conten
cac0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74  t of the page at
cad0: 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20   this time.  So 
cae0: 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65  do not go to the
caf0: 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63   disk.** to fetc
cb00: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20  h the content.  
cb10: 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65  Just fill in the
cb20: 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65   content with ze
cb30: 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20  ros for now..** 
cb40: 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  If in the future
cb50: 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   we call sqlite3
cb60: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
cb70: 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a  this page, that.
cb80: 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65  ** means we have
cb90: 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63   started to be c
cba0: 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63  oncerned about c
cbb0: 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64  ontent and the d
cbc0: 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75  isk.** read shou
cbd0: 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74  ld occur at that
cbe0: 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69   point..*/.stati
cbf0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61  c int btreeGetPa
cc00: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
cc10: 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
cc20: 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
cc30: 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
cc40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
cc50: 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
cc60: 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
cc70: 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
cc80: 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
cc90: 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
cca0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
ccb0: 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  nt        /* Do 
ccc0: 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f  not load page co
ccd0: 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f  ntent if true */
cce0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
ccf0: 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
cd00: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
cd10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
cd20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
cd30: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
cd40: 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50  rAcquire(pBt->pP
cd50: 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
cd60: 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
cd70: 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66  noContent);.  if
cd80: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
cd90: 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  ;.  *ppPage = bt
cda0: 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
cdb0: 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
cdc0: 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20   pBt);.  return 
cdd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cde0: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70  .** Retrieve a p
cdf0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
ce00: 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65  er cache. If the
ce10: 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
ce20: 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64  is not.** alread
ce30: 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  y in the pager c
ce40: 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ache return NULL
ce50: 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  . Initialize the
ce60: 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64   MemPage.pBt and
ce70: 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  .** MemPage.aDat
ce80: 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65  a elements if ne
ce90: 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eded..*/.static 
cea0: 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61  MemPage *btreePa
ceb0: 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65  geLookup(BtShare
cec0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
ced0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
cee0: 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  bPage;.  assert(
cef0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
cf00: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
cf10: 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73  );.  pDbPage = s
cf20: 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75  qlite3PagerLooku
cf30: 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  p(pBt->pPager, p
cf40: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50  gno);.  if( pDbP
cf50: 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
cf60: 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  n btreePageFromD
cf70: 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
cf80: 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20  gno, pBt);.  }. 
cf90: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
cfa0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
cfb0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
cfc0: 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65  ase file in page
cfd0: 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  s. If there is a
cfe0: 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72  ny kind of.** er
cff0: 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e  ror, return ((un
d000: 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a  signed int)-1)..
d010: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 62  */.static Pgno b
d020: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42 74  treePagecount(Bt
d030: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
d040: 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67  return pBt->nPag
d050: 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  e;.}.u32 sqlite3
d060: 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42 74  BtreeLastPage(Bt
d070: 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
d080: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
d090: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
d0a0: 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e 70    assert( ((p->p
d0b0: 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30 30  Bt->nPage)&0x800
d0c0: 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  0000)==0 );.  re
d0d0: 74 75 72 6e 20 28 69 6e 74 29 62 74 72 65 65 50  turn (int)btreeP
d0e0: 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29  agecount(p->pBt)
d0f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
d100: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
d110: 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c  ager and initial
d120: 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f  ize it.  This ro
d130: 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a  utine is just a.
d140: 2a 2a 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77  ** convenience w
d150: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65  rapper around se
d160: 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20  parate calls to 
d170: 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61  btreeGetPage() a
d180: 6e 64 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74  nd .** btreeInit
d190: 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
d1a0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
d1b0: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
d1c0: 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
d1d0: 74 6f 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  to is undefined.
d1e0: 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69   It.** may remai
d1f0: 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20  n unchanged, or 
d200: 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  it may be set to
d210: 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75   an invalid valu
d220: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
d230: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
d240: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
d250: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
d260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
d270: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
d280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d290: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
d2a0: 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50  to get */.  MemP
d2b0: 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20 20  age **ppPage    
d2c0: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
d2d0: 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
d2e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
d2f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
d300: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
d310: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69  ->mutex) );..  i
d320: 66 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67  f( pgno>btreePag
d330: 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
d340: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
d350: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
d360: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62  else{.    rc = b
d370: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
d380: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
d390: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
d3a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d3b0: 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
d3c0: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
d3d0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
d3e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d3f0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
d400: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
d410: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73      }.  }..  tes
d420: 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29  tcase( pgno==0 )
d430: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  ;.  assert( pgno
d440: 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  !=0 || rc==SQLIT
d450: 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72  E_CORRUPT );.  r
d460: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d470: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d  ** Release a Mem
d480: 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75  Page.  This shou
d490: 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  ld be called onc
d4a0: 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72  e for each prior
d4b0: 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65  .** call to btre
d4c0: 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  eGetPage..*/.sta
d4d0: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
d4e0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
d4f0: 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
d500: 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
d510: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
d520: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
d530: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
d540: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d550: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
d560: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
d570: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
d580: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
d590: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
d5a0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
d5b0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
d5c0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d5d0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d5e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d5f0: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
d600: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
d610: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
d620: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
d630: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
d640: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
d650: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
d660: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
d670: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
d680: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
d690: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
d6a0: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
d6b0: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
d6c0: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
d6d0: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
d6e0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
d6f0: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
d700: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
d710: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
d720: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
d730: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
d740: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
d750: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
d760: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
d770: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
d780: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
d790: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
d7a0: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
d7b0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
d7c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d7d0: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
d7e0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d7f0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d800: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
d810: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
d820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
d830: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d840: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d850: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
d860: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
d870: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
d880: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
d890: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
d8a0: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
d8b0: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
d8c0: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
d8d0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
d8e0: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
d8f0: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
d900: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
d910: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
d920: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
d930: 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
d940: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
d950: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
d960: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
d970: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
d980: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
d990: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
d9a0: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
d9b0: 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
d9c0: 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
d9d0: 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
d9e0: 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
d9f0: 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
da00: 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
da10: 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
da20: 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
da30: 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
da40: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
da50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
da60: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
da70: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
da80: 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
da90: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
daa0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
dab0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
dac0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
dad0: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
dae0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
daf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
db00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
db10: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
db20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
db30: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
db40: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
db50: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
db60: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
db70: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
db80: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
db90: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
dba0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
dbb0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
dbc0: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
dbd0: 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
dbe0: 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
dbf0: 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
dc00: 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
dc10: 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
dc20: 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
dc30: 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
dc40: 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
dc50: 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
dc60: 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
dc70: 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
dc80: 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
dc90: 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
dca0: 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
dcb0: 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
dcc0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
dcd0: 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
dce0: 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
dcf0: 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
dd00: 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
dd10: 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
dd20: 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
dd30: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
dd40: 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
dd50: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
dd60: 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
dd70: 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 0a 2a  t contain bits.*
dd80: 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
dd90: 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
dda0: 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 2e 20 20  E_NO_READLOCK.  
ddb0: 54 68 65 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41  The BTREE_NO_REA
ddc0: 44 4c 4f 43 4b 0a 2a 2a 20 62 69 74 20 69 73 20  DLOCK.** bit is 
ddd0: 61 6c 73 6f 20 73 65 74 20 69 66 20 74 68 65 20  also set if the 
dde0: 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63  SQLITE_NoReadloc
ddf0: 6b 20 66 6c 61 67 73 20 69 73 20 73 65 74 20 69  k flags is set i
de00: 6e 20 64 62 2d 3e 66 6c 61 67 73 2e 0a 2a 2a 20  n db->flags..** 
de10: 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20  These flags are 
de20: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 69  passed through i
de30: 6e 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  nto sqlite3Pager
de40: 4f 70 65 6e 28 29 20 61 6e 64 20 6d 75 73 74 0a  Open() and must.
de50: 2a 2a 20 62 65 20 74 68 65 20 73 61 6d 65 20 76  ** be the same v
de60: 61 6c 75 65 73 20 61 73 20 50 41 47 45 52 5f 4f  alues as PAGER_O
de70: 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20  MIT_JOURNAL and 
de80: 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
de90: 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
dea0: 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65  database is alre
deb0: 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68  ady opened in th
dec0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
ded0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e  connection.** an
dee0: 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72  d we are in shar
def0: 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed cache mode, t
df00: 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c  hen the open wil
df10: 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a  l fail with an.*
df20: 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  * SQLITE_CONSTRA
df30: 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63  INT error.  We c
df40: 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20  annot allow two 
df50: 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64  or more BtShared
df60: 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  .** objects in t
df70: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
df80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63   connection sinc
df90: 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20  e doing so will 
dfa0: 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c  lead.** to probl
dfb0: 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67  ems with locking
dfc0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dfd0: 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c  BtreeOpen(.  sql
dfe0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
dff0: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
e000: 73 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72  se for this b-tr
e010: 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ee */.  const ch
e020: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
e030: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
e040: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
e050: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
e060: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
e070: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  db,            /
e080: 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74  * Associated dat
e090: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
e0a0: 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65    Btree **ppBtre
e0b0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  e,        /* Poi
e0c0: 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65  nter to new Btre
e0d0: 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e  e object written
e0e0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
e0f0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
e100: 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f     /* Options */
e110: 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20  .  int vfsFlags 
e120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
e130: 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
e140: 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
e150: 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
e160: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e170: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e180: 20 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20   /* Shared part 
e190: 6f 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75  of btree structu
e1a0: 72 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  re */.  Btree *p
e1b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1c0: 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
e1d0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
e1e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
e1f0: 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f  utexOpen = 0;  /
e200: 2a 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63  * Prevents a rac
e210: 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63  e condition. Tic
e220: 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69  ket #3537 */.  i
e230: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
e240: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
e250: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
e260: 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  m this function 
e270: 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65  */.  u8 nReserve
e280: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e290: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75      /* Byte of u
e2a0: 6e 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65  nused space on e
e2b0: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  ach page */.  un
e2c0: 73 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48  signed char zDbH
e2d0: 65 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20  eader[100];  /* 
e2e0: 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
e2f0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  content */..  /*
e300: 20 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67   True if opening
e310: 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74   an ephemeral, t
e320: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
e330: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
e340: 20 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c   isTempDb = zFil
e350: 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
e360: 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20  ename[0]==0;..  
e370: 2f 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61  /* Set the varia
e380: 62 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74  ble isMemdb to t
e390: 72 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65  rue for an in-me
e3a0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f  mory database, o
e3b0: 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f  r .  ** false fo
e3c0: 72 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64  r a file-based d
e3d0: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69  atabase..  */.#i
e3e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
e3f0: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73  _MEMORYDB.  cons
e400: 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20  t int isMemdb = 
e410: 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74  0;.#else.  const
e420: 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28   int isMemdb = (
e430: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72  zFilename && str
e440: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  cmp(zFilename, "
e450: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20  :memory:")==0). 
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70        || (isTemp
e480: 44 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d  Db && sqlite3Tem
e490: 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 3b 0a  pInMemory(db));.
e4a0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
e4b0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
e4c0: 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
e4d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e4e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
e4f0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
e500: 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
e510: 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
e520: 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
e530: 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
e540: 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
e550: 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
e560: 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
e570: 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
e580: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
e590: 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
e5a0: 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
e5b0: 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
e5c0: 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
e5d0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
e5e0: 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
e5f0: 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
e600: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
e610: 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
e620: 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
e630: 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 64 62  pDb );..  if( db
e640: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
e650: 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20  _NoReadlock ){. 
e660: 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45     flags |= BTRE
e670: 45 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 3b 0a 20  E_NO_READLOCK;. 
e680: 20 7d 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62   }.  if( isMemdb
e690: 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
e6a0: 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
e6b0: 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
e6c0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
e6d0: 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
e6e0: 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
e6f0: 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
e700: 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
e710: 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
e720: 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
e730: 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
e740: 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
e750: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
e760: 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
e770: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
e780: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e790: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61  ;.  }.  p->inTra
e7a0: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
e7b0: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23  .  p->db = db;.#
e7c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e7d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
e7e0: 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65    p->lock.pBtree
e7f0: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e   = p;.  p->lock.
e800: 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64  iTable = 1;.#end
e810: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
e820: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
e830: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
e840: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e850: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a  IT_DISKIO).  /*.
e860: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72    ** If this Btr
e870: 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74  ee is a candidat
e880: 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63  e for shared cac
e890: 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20  he, try to find 
e8a0: 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67  an.  ** existing
e8b0: 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
e8c0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61   that we can sha
e8d0: 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69  re with.  */.  i
e8e0: 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26  f( isMemdb==0 &&
e8f0: 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 29 7b 0a   isTempDb==0 ){.
e900: 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
e910: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
e920: 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
e930: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
e940: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
e950: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
e960: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
e970: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
e980: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
e990: 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
e9a0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
e9b0: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
e9c0: 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
e9d0: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
e9e0: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
e9f0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
ea00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
ea10: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
ea20: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
ea30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
ea40: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
ea50: 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
ea60: 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50  Filename, nFullP
ea70: 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
ea80: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  thname);.      i
ea90: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
eaa0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
eab0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
eac0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
ead0: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
eae0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
eaf0: 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
eb00: 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
eb10: 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
eb20: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
eb30: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
eb40: 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
eb50: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
eb60: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
eb70: 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
eb80: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
eb90: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
eba0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
ebb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ebc0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
ebd0: 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
ebe0: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
ebf0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
ec00: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
ec10: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
ec20: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
ec30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
ec40: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
ec50: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
ec60: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
ec70: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
ec80: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
ec90: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
eca0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
ecb0: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
ecc0: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
ecd0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
ece0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
ecf0: 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44  Db=db->nDb-1; iD
ed00: 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20  b>=0; iDb--){.  
ed10: 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20            Btree 
ed20: 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d  *pExisting = db-
ed30: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
ed40: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
ed50: 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69  Existing && pExi
ed60: 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20  sting->pBt==pBt 
ed70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
ed80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
ed90: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
eda0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
edb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
edc0: 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b  eave(mutexOpen);
edd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
ede0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
edf0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
ee00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
ee10: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
ee20: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
ee30: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ee40: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
ee50: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ee60: 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20         p->pBt = 
ee70: 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pBt;.          p
ee80: 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  Bt->nRef++;.    
ee90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
eea0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
eeb0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
eec0: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
eed0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  ared);.      sql
eee0: 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
eef0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
ef00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
ef10: 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
ef20: 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20      /* In debug 
ef30: 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c  mode, we mark al
ef40: 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74  l persistent dat
ef50: 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62  abases as sharab
ef60: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e  le.      ** even
ef70: 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e   when they are n
ef80: 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69  ot.  This exerci
ef90: 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ses the locking 
efa0: 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a  code and.      *
efb0: 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70  * gives more opp
efc0: 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73  ortunity for ass
efd0: 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74  erts(sqlite3_mut
efe0: 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20  ex_held()).     
eff0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74   ** statements t
f000: 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70  o find locking p
f010: 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a  roblems..      *
f020: 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  /.      p->shara
f030: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ble = 1;.    }.#
f040: 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66  endif.  }.#endif
f050: 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b  .  if( pBt==0 ){
f060: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
f070: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
f080: 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74  erts make sure t
f090: 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75  hat structures u
f0a0: 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  sed by the btree
f0b0: 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
f0c0: 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69  right size.  Thi
f0d0: 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67  s is to guard ag
f0e0: 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67  ainst size chang
f0f0: 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20  es that result. 
f100: 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69     ** when compi
f110: 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72  ling on a differ
f120: 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ent architecture
f130: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f140: 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29  ert( sizeof(i64)
f150: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69 36  ==8 || sizeof(i6
f160: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
f170: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
f180: 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75 36  ==8 || sizeof(u6
f190: 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  4)==4 );.    ass
f1a0: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29  ert( sizeof(u32)
f1b0: 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==4 );.    asser
f1c0: 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d  t( sizeof(u16)==
f1d0: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
f1e0: 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34   sizeof(Pgno)==4
f1f0: 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d   );.  .    pBt =
f200: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
f210: 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29  ro( sizeof(*pBt)
f220: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d   );.    if( pBt=
f230: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
f240: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
f250: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
f260: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
f270: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f280: 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
f290: 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
f2a0: 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66     EXTRA_SIZE, f
f2d0: 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20  lags, vfsFlags, 
f2e0: 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
f2f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f300: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
f310: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
f320: 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
f330: 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
f340: 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
f350: 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
f360: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f370: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
f380: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
f390: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
f3a0: 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
f3b0: 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
f3c0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
f3d0: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
f3e0: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
f3f0: 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
f400: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
f410: 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
f420: 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
f430: 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
f440: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
f450: 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f  ;.    pBt->readO
f460: 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67  nly = sqlite3Pag
f470: 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
f480: 2d 3e 70 50 61 67 65 72 29 3b 0a 23 69 66 64 65  ->pPager);.#ifde
f490: 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
f4a0: 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
f4b0: 73 65 63 75 72 65 44 65 6c 65 74 65 20 3d 20 31  secureDelete = 1
f4c0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 42 74  ;.#endif.    pBt
f4d0: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
f4e0: 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
f4f0: 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
f500: 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
f510: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
f520: 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
f530: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
f540: 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
f550: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
f560: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
f570: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
f580: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
f590: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
f5a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f5b0: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
f5c0: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
f5d0: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
f5e0: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
f5f0: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
f600: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
f610: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
f620: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
f630: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
f640: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
f650: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
f660: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
f670: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
f680: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
f690: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
f6a0: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
f6b0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
f6c0: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
f6d0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
f6e0: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
f6f0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
f700: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
f710: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
f720: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
f730: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
f740: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
f750: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
f760: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
f770: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
f780: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
f790: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
f7a0: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
f7b0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
f7c0: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
f7d0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
f7e0: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
f7f0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
f800: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
f810: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
f820: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
f830: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
f840: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f850: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
f860: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
f870: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
f880: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
f890: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
f8a0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
f8b0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
f8c0: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
f8d0: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
f8e0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
f8f0: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
f900: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
f910: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
f920: 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
f930: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
f940: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
f950: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
f960: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
f970: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
f980: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
f990: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
f9a0: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
f9b0: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
f9c0: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
f9d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
f9e0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
f9f0: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
fa00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
fa10: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
fa20: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
fa30: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
fa40: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
fa50: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
fa60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
fa70: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
fa80: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
fa90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
faa0: 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20  texShared; ).   
fab0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
fac0: 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
fad0: 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
fae0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
faf0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
fb00: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
fb10: 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
fb20: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
fb30: 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
fb40: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
fb50: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
fb60: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
fb70: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
fb80: 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
fb90: 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
fba0: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
fbb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fbc0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
fbd0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
fbe0: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  led = 0;.       
fbf0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
fc00: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  en_out;.        
fc10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
fc20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
fc30: 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
fc40: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65  ;.      pBt->pNe
fc50: 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68  xt = GLOBAL(BtSh
fc60: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fc70: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20  redCacheList);. 
fc80: 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68       GLOBAL(BtSh
fc90: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
fca0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20  redCacheList) = 
fcb0: 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pBt;.      sqlit
fcc0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
fcd0: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
fce0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23   }.#endif.  }..#
fcf0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
fd00: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
fd10: 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
fd20: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
fd30: 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68  SKIO).  /* If th
fd40: 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73  e new Btree uses
fd50: 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53   a sharable pBtS
fd60: 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b  hared, then link
fd70: 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74   the new.  ** Bt
fd80: 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73  ree into the lis
fd90: 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c  t of all sharabl
fda0: 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65  e Btrees for the
fdb0: 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e   same connection
fdc0: 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20  ..  ** The list 
fdd0: 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e  is kept in ascen
fde0: 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42  ding order by pB
fdf0: 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a  t address..  */.
fe00: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
fe10: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
fe20: 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b      Btree *pSib;
fe30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
fe40: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
fe50: 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d       if( (pSib =
fe60: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29   db->aDb[i].pBt)
fe70: 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61  !=0 && pSib->sha
fe80: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
fe90: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50   while( pSib->pP
fea0: 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53  rev ){ pSib = pS
feb0: 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20  ib->pPrev; }.   
fec0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c       if( p->pBt<
fed0: 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20  pSib->pBt ){.   
fee0: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
fef0: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
ff00: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
ff10: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
ff20: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
ff30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ff40: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
ff50: 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e  >pNext && pSib->
ff60: 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42  pNext->pBt<p->pB
ff70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ff80: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
ff90: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
ffa0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
ffb0: 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
ffc0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
ffd0: 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
ffe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
fff0: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
10000 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
10010 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
10020 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
10030 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
10040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10050 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10060 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
10070 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
10080 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
10090 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
100a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
100b0 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
100c0 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
100d0 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
100e0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
100f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
10100 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
10110 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
10120 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
10130 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10140 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20  * If the B-Tree 
10150 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
10160 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65   opened, set the
10170 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a   pager-cache siz
10180 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  e to the.    ** 
10190 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
101a0 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e  xcept, when open
101b0 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69  ing on an existi
101c0 6e 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d  ng shared pager-
101d0 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f  cache,.    ** do
101e0 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
101f0 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
10200 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10210 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
10220 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20  ema(p, 0, 0)==0 
10230 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10240 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
10250 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
10260 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
10270 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20  _CACHE_SIZE);.  
10280 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75    }.  }.  if( mu
10290 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61  texOpen ){.    a
102a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
102b0 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f  utex_held(mutexO
102c0 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69  pen) );.    sqli
102d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
102e0 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a  mutexOpen);.  }.
102f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10300 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
10310 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
10320 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e  f counter.  When
10330 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f   it reaches zero
10340 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20  ,.** remove the 
10350 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
10360 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72  re from the shar
10370 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72  ing list.  Retur
10380 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65  n.** true if the
10390 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
103a0 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a  ounter reaches z
103b0 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  ero and return.*
103c0 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73  * false if it is
103d0 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e   still positive.
103e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
103f0 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
10400 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70  List(BtShared *p
10410 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Bt){.#ifndef SQL
10420 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
10430 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f  CACHE.  MUTEX_LO
10440 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
10450 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20  ex *pMaster; ). 
10460 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
10470 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
10480 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
10490 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
104a0 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
104b0 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ) );.  MUTEX_LOG
104c0 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
104d0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
104e0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
104f0 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
10500 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
10510 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
10520 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pBt->nRef--;.  
10530 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30  if( pBt->nRef<=0
10540 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42   ){.    if( GLOB
10550 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
10560 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
10570 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20  ist)==pBt ){.   
10580 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72     GLOBAL(BtShar
10590 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
105a0 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42  dCacheList) = pB
105b0 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  t->pNext;.    }e
105c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74  lse{.      pList
105d0 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72   = GLOBAL(BtShar
105e0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
105f0 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20  dCacheList);.   
10600 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
10610 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74  (pList) && pList
10620 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a  ->pNext!=pBt ){.
10630 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c          pList=pL
10640 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ist->pNext;.    
10650 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c    }.      if( AL
10660 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20  WAYS(pList) ){. 
10670 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e         pList->pN
10680 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  ext = pBt->pNext
10690 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
106a0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
106b0 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20  HREADSAFE ){.   
106c0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
106d0 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78  _free(pBt->mutex
106e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  );.    }.    rem
106f0 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  oved = 1;.  }.  
10700 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
10710 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
10720 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a  return removed;.
10730 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31  #else.  return 1
10740 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
10750 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d  * Make sure pBt-
10760 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74  >pTmpSpace point
10770 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69  s to an allocati
10780 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c  on of .** MX_CEL
10790 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65  L_SIZE(pBt) byte
107a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
107b0 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
107c0 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
107d0 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
107e0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
107f0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
10800 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
10810 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
10820 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ze );.  }.}../*.
10830 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d  ** Free the pBt-
10840 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63  >pTmpSpace alloc
10850 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
10860 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61  void freeTempSpa
10870 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
10880 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ){.  sqlite3Page
10890 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53  Free( pBt->pTmpS
108a0 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54  pace);.  pBt->pT
108b0 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a  mpSpace = 0;.}..
108c0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
108d0 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
108e0 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
108f0 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
10900 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
10910 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
10920 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10930 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
10940 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
10950 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
10960 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
10970 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
10980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10990 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
109a0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
109b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
109c0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
109d0 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
109e0 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
109f0 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
10a00 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
10a10 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
10a20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
10a30 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
10a40 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
10a50 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
10a60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
10a70 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
10a80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
10a90 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
10aa0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
10ab0 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
10ac0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
10ad0 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
10ae0 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
10af0 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
10b00 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
10b10 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
10b20 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
10b30 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
10b40 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
10b50 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
10b60 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
10b70 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
10b80 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
10b90 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
10ba0 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
10bb0 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
10bc0 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
10bd0 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
10be0 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
10bf0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
10c00 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
10c10 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
10c20 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
10c30 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
10c40 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
10c50 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
10c60 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
10c70 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
10c80 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
10c90 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
10ca0 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
10cb0 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
10cc0 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
10cd0 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
10ce0 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
10cf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
10d00 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
10d10 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
10d20 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
10d30 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
10d40 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
10d50 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
10d60 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
10d70 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
10d80 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
10d90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
10da0 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
10db0 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
10dc0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
10dd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10de0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
10df0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
10e00 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
10e10 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
10e20 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
10e30 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
10e40 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
10e50 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
10e60 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
10e70 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
10e80 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
10e90 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
10ea0 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
10eb0 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
10ec0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10ed0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
10ee0 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
10ef0 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
10f00 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
10f10 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
10f20 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
10f30 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
10f40 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
10f50 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
10f60 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
10f70 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
10f80 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
10f90 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
10fa0 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
10fb0 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
10fc0 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
10fd0 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
10fe0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
10ff0 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
11000 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
11010 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
11020 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
11030 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
11040 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
11050 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
11060 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
11070 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
11080 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
11090 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
110a0 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
110b0 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
110c0 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
110d0 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
110e0 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
110f0 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
11100 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
11110 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
11120 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
11130 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
11140 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
11150 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
11160 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
11170 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
11180 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
11190 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
111a0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
111b0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
111c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
111d0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
111e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
111f0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
11200 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
11210 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11220 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
11230 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
11240 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
11250 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
11260 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
11270 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11280 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
11290 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
112a0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
112b0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
112c0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
112d0 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
112e0 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
112f0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
11300 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
11310 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
11320 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
11330 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
11340 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
11350 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
11360 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
11370 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
11380 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
11390 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
113a0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
113b0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
113c0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
113d0 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
113e0 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
113f0 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
11400 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
11410 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
11420 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
11430 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
11440 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
11450 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
11460 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
11470 53 61 66 65 74 79 4c 65 76 65 6c 28 0a 20 20 42  SafetyLevel(.  B
11480 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
11490 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
114a0 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
114b0 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
114c0 0a 20 20 69 6e 74 20 6c 65 76 65 6c 2c 20 20 20  .  int level,   
114d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 52 41            /* PRA
114e0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 2e  GMA synchronous.
114f0 20 20 31 3d 4f 46 46 2c 20 32 3d 4e 4f 52 4d 41    1=OFF, 2=NORMA
11500 4c 2c 20 33 3d 46 55 4c 4c 20 2a 2f 0a 20 20 69  L, 3=FULL */.  i
11510 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 20 20 20  nt fullSync,    
11520 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41 20        /* PRAGMA 
11530 66 75 6c 6c 66 73 79 6e 63 2e 20 2a 2f 0a 20 20  fullfsync. */.  
11540 69 6e 74 20 63 6b 70 74 46 75 6c 6c 53 79 6e 63  int ckptFullSync
11550 20 20 20 20 20 20 20 2f 2a 20 50 52 41 47 4d 41         /* PRAGMA
11560 20 63 68 65 63 6b 70 6f 69 6e 74 5f 66 75 6c 6c   checkpoint_full
11570 66 79 6e 63 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  fync */.){.  BtS
11580 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
11590 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
115a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
115b0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
115c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 65 76  );.  assert( lev
115d0 65 6c 3e 3d 31 20 26 26 20 6c 65 76 65 6c 3c 3d  el>=1 && level<=
115e0 33 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  3 );.  sqlite3Bt
115f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
11600 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
11610 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
11620 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
11630 6c 6c 53 79 6e 63 2c 20 63 6b 70 74 46 75 6c 6c  llSync, ckptFull
11640 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
11650 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11660 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11670 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
11680 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
11690 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
116a0 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
116b0 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
116c0 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
116d0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
116e0 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
116f0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
11700 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
11710 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
11720 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
11730 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11740 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
11750 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11760 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11770 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
11780 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
11790 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
117a0 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
117b0 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
117c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
117d0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
117e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
117f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
11800 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11810 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
11820 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
11830 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
11840 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
11850 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
11860 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
11870 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
11880 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
11890 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
118a0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
118b0 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
118c0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
118d0 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
118e0 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
118f0 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
11900 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
11910 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
11920 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
11930 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
11940 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
11950 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
11960 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
11970 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
11980 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
11990 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
119a0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
119b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
119c0 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
119d0 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
119e0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
119f0 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
11a00 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
11a10 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
11a20 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
11a30 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
11a40 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
11a50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
11a60 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
11a70 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
11a80 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
11a90 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
11aa0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
11ab0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
11ac0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
11ad0 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
11ae0 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 66 6c  pageSizeFixed fl
11af0 61 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61  ag is set so tha
11b00 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a  t the page size.
11b10 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75  ** and autovacuu
11b20 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f  m mode can no lo
11b30 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e  nger be changed.
11b40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
11b50 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
11b60 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
11b70 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
11b80 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b  erve, int iFix){
11b90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11ba0 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65  TE_OK;.  BtShare
11bb0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
11bc0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
11bd0 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65  rve>=-1 && nRese
11be0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71  rve<=255 );.  sq
11bf0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
11c00 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
11c10 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a  ageSizeFixed ){.
11c20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
11c30 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
11c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
11c50 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
11c60 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
11c70 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
11c80 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
11c90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
11ca0 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
11cb0 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
11cc0 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
11cd0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
11ce0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
11cf0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
11d00 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
11d10 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
11d20 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
11d30 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
11d40 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
11d50 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50  assert( !pBt->pP
11d60 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43  age1 && !pBt->pC
11d70 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
11d80 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
11d90 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
11da0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
11db0 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
11dc0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
11dd0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
11de0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
11df0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
11e00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11e10 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
11e20 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
11e30 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
11e40 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
11e50 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33  d = 1;.  sqlite3
11e60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
11e70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11e80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11e90 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
11ea0 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
11eb0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
11ec0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
11ed0 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
11ee0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
11ef0 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
11f00 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47  (SQLITE_OMIT_PAG
11f10 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21  ER_PRAGMAS) || !
11f20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11f30 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a  MIT_VACUUM)./*.*
11f40 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
11f50 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
11f60 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64  space at the end
11f70 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 74   of every page t
11f80 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  hat.** are inten
11f90 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73  tually left unus
11fa0 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65  ed.  This is the
11fb0 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61 63   "reserved" spac
11fc0 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d  e that is.** som
11fd0 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20 65  etimes used by e
11fe0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e  xtensions..*/.in
11ff0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
12000 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a  tReserve(Btree *
12010 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  p){.  int n;.  s
12020 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12030 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  (p);.  n = p->pB
12040 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
12050 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
12060 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
12070 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
12080 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
12090 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  et the maximum p
120a0 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  age count for a 
120b0 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61  database if mxPa
120c0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a  ge is positive..
120d0 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  ** No changes ar
120e0 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65  e made if mxPage
120f0 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76   is 0 or negativ
12100 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  e..** Regardless
12110 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
12120 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20   mxPage, return 
12130 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
12140 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
12150 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61  qlite3BtreeMaxPa
12160 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70  geCount(Btree *p
12170 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
12180 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
12190 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
121a0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67    n = sqlite3Pag
121b0 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70  erMaxPageCount(p
121c0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d  ->pBt->pPager, m
121d0 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65  xPage);.  sqlite
121e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
121f0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
12200 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65 63  *.** Set the sec
12210 75 72 65 44 65 6c 65 74 65 20 66 6c 61 67 20 69  ureDelete flag i
12220 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f  f newFlag is 0 o
12230 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67  r 1.  If newFlag
12240 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20   is -1,.** then 
12250 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e  make no changes.
12260 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
12270 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12280 20 73 65 63 75 72 65 44 65 6c 65 74 65 0a 2a 2a   secureDelete.**
12290 20 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74   setting after t
122a0 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e  he change..*/.in
122b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
122c0 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
122d0 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
122e0 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
122f0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
12300 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
12310 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
12320 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
12330 20 20 20 70 2d 3e 70 42 74 2d 3e 73 65 63 75 72     p->pBt->secur
12340 65 44 65 6c 65 74 65 20 3d 20 28 6e 65 77 46 6c  eDelete = (newFl
12350 61 67 21 3d 30 29 20 3f 20 31 20 3a 20 30 3b 0a  ag!=0) ? 1 : 0;.
12360 20 20 7d 20 0a 20 20 62 20 3d 20 70 2d 3e 70 42    } .  b = p->pB
12370 74 2d 3e 73 65 63 75 72 65 44 65 6c 65 74 65 3b  t->secureDelete;
12380 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12390 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
123a0 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n b;.}.#endif /*
123b0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
123c0 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
123d0 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
123e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
123f0 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
12400 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
12410 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
12420 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12430 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
12440 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
12450 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
12460 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
12470 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
12480 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
12490 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
124a0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
124b0 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
124c0 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
124d0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
124e0 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
124f0 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
12500 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
12510 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
12520 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
12530 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
12540 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12550 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12560 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12570 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
12580 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12590 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
125a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
125b0 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
125c0 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
125d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
125e0 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
125f0 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20  ageSizeFixed && 
12600 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
12610 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
12620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
12630 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
12640 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
12650 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
12660 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
12670 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
12680 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
12690 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
126a0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
126b0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
126c0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
126d0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
126e0 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
126f0 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
12700 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
12710 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
12720 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
12730 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
12740 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
12750 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12760 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12770 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
12780 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
12790 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
127a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
127b0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
127c0 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
127d0 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
127e0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
127f0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
12800 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
12810 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
12820 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
12830 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
12840 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12850 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12860 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
12870 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
12880 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
12890 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
128a0 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
128b0 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
128c0 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
128d0 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
128e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
128f0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
12900 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
12910 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
12920 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
12930 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
12940 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
12950 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
12960 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
12970 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
12980 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
12990 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
129a0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
129b0 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
129c0 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
129d0 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
129e0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
129f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
12a00 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
12a10 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74  de from subfunct
12a20 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ions */.  MemPag
12a30 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f  e *pPage1;     /
12a40 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20  * Page 1 of the 
12a50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
12a60 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20  .  int nPage;   
12a70 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12a80 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
12a90 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
12aa0 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20  int nPageFile = 
12ab0 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  0;   /* Number o
12ac0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
12ad0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
12ae0 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65    int nPageHeade
12af0 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  r;     /* Number
12b00 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
12b10 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64   database accord
12b20 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20  ing to hdr */.. 
12b30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12b40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
12b50 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
12b60 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
12b70 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
12b80 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64  lite3PagerShared
12b90 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  Lock(pBt->pPager
12ba0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12bb0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
12bc0 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  rc;.  rc = btree
12bd0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
12be0 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69  &pPage1, 0);.  i
12bf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12c00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
12c10 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63   /* Do some chec
12c20 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73  king to help ins
12c30 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20  ure the file we 
12c40 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73  opened really is
12c50 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61  .  ** a valid da
12c60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20  tabase file. .  
12c70 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  */.  nPage = nPa
12c80 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62  geHeader = get4b
12c90 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
12ca0 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71  e1->aData);.  sq
12cb0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12cc0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
12cd0 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20   &nPageFile);.  
12ce0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20  if( nPage==0 || 
12cf0 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70  memcmp(24+(u8*)p
12d00 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32  Page1->aData, 92
12d10 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
12d20 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20  ata,4)!=0 ){.   
12d30 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69   nPage = nPageFi
12d40 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  le;.  }.  if( nP
12d50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
12d60 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 75   pageSize;.    u
12d70 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  32 usableSize;. 
12d80 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70     u8 *page1 = p
12d90 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
12da0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12db0 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65  TADB;.    if( me
12dc0 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67  mcmp(page1, zMag
12dd0 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30  icHeader, 16)!=0
12de0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12df0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12e00 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
12e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
12e20 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
12e30 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>1 ){.      pBt
12e40 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
12e50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
12e60 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
12e70 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
12e80 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
12e90 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
12ea0 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
12eb0 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
12ec0 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
12ed0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
12ee0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
12ef0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
12f00 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12f10 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
12f20 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
12f30 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
12f40 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
12f50 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
12f60 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
12f70 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
12f80 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
12f90 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
12fa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12fb0 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
12fc0 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
12fd0 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
12fe0 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
12ff0 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
13000 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
13010 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
13020 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
13030 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
13040 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
13050 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
13060 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
13070 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
13080 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
13090 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
130a0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
130b0 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
130c0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
130d0 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
130e0 32 20 26 26 20 70 42 74 2d 3e 64 6f 4e 6f 74 55  2 && pBt->doNotU
130f0 73 65 57 41 4c 3d 3d 30 20 29 7b 0a 20 20 20 20  seWAL==0 ){.    
13100 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30    int isOpen = 0
13110 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13120 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c  ite3PagerOpenWal
13130 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69  (pBt->pPager, &i
13140 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66  sOpen);.      if
13150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13160 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
13170 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
13180 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  d;.      }else i
13190 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
131a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
131b0 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59  FAULT_WAL_SAFETY
131c0 4c 45 56 45 4c 0a 20 20 20 20 20 20 20 20 2f 2a  LEVEL.        /*
131d0 20 44 65 66 61 75 6c 74 20 74 6f 20 73 70 65 63   Default to spec
131e0 69 66 69 65 64 20 73 61 66 65 74 79 5f 6c 65 76  ified safety_lev
131f0 65 6c 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65 20  el for WAL mode 
13200 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
13210 42 74 2d 3e 64 62 21 3d 30 20 26 26 20 70 42 74  Bt->db!=0 && pBt
13220 2d 3e 64 62 2d 3e 61 44 62 21 3d 30 20 29 7b 0a  ->db->aDb!=0 ){.
13230 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
13240 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  b;.          sql
13250 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e  ite3 *db = pBt->
13260 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 44 62  db;.          Db
13270 20 2a 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b   *aDb = db->aDb;
13280 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 6c 65  .          u8 le
13290 76 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  vel = 0;.       
132a0 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44     for(iDb=0; iD
132b0 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
132c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
132d0 66 28 20 61 44 62 5b 69 44 62 5d 2e 70 42 74 20  f( aDb[iDb].pBt 
132e0 26 26 20 61 44 62 5b 69 44 62 5d 2e 70 42 74 2d  && aDb[iDb].pBt-
132f0 3e 70 42 74 3d 3d 70 42 74 20 29 20 62 72 65 61  >pBt==pBt ) brea
13300 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
13310 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13320 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
13330 20 20 20 20 20 20 20 20 20 20 6c 65 76 65 6c 20            level 
13340 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73  = db->aDb[iDb].s
13350 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20  afety_level;.   
13360 20 20 20 20 20 20 20 69 66 28 20 21 53 51 4c 49         if( !SQLI
13370 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65 6c  TE_DbSafetyLevel
13380 49 73 46 69 78 65 64 28 6c 65 76 65 6c 29 20 26  IsFixed(level) &
13390 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  & .             
133a0 28 53 51 4c 49 54 45 5f 44 62 53 61 66 65 74 79  (SQLITE_DbSafety
133b0 4c 65 76 65 6c 56 61 6c 75 65 28 6c 65 76 65 6c  LevelValue(level
133c0 29 20 21 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ) != SQLITE_DEFA
133d0 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45  ULT_WAL_SAFETYLE
133e0 56 45 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  VEL) ){.        
133f0 20 20 20 20 61 44 62 5b 69 44 62 5d 2e 73 61 66      aDb[iDb].saf
13400 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49  ety_level = SQLI
13410 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
13420 41 46 45 54 59 4c 45 56 45 4c 3b 0a 20 20 20 20  AFETYLEVEL;.    
13430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
13440 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
13450 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
13460 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
13470 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 2c 20  AL_SAFETYLEVEL, 
13480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134a0 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c 61          (db->fla
134b0 67 73 26 53 51 4c 49 54 45 5f 46 75 6c 6c 46 53  gs&SQLITE_FullFS
134c0 79 6e 63 29 21 3d 30 2c 0a 20 20 20 20 20 20 20  ync)!=0,.       
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54  (db->flags&SQLIT
13500 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63 29  E_CkptFullFSync)
13510 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  !=0);.          
13520 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  }.        }.#end
13530 69 66 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  if.        relea
13540 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13550 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
13570 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  }.      rc = SQL
13580 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
13590 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
135a0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62   The maximum emb
135b0 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
135c0 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32  ust be exactly 2
135d0 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e  5%.  And the min
135e0 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65  imum.    ** embe
135f0 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
13600 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20  st be 12.5% for 
13610 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61  both leaf-data a
13620 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  nd non-leaf-data
13630 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  ..    ** The ori
13640 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
13650 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
13660 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
13670 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
13680 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
13690 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
136a0 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
136b0 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
136c0 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
136d0 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
136e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
136f0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
13700 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53  .    }.    pageS
13710 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d  ize = (page1[16]
13720 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37  <<8) | (page1[17
13730 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20  ]<<16);.    if( 
13740 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
13750 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20  geSize)!=0.     
13760 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  || pageSize>SQLI
13770 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
13780 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69   .     || pageSi
13790 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a  ze<=256 .    ){.
137a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
137b0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
137c0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
137d0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
137e0 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
137f0 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
13800 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
13810 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
13820 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
13830 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
13840 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
13850 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
13860 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
13870 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
13880 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
13890 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
138a0 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
138b0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
138c0 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
138d0 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
138e0 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
138f0 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
13900 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
13910 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
13920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
13930 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
13940 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
13950 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
13960 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
13970 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
13980 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
13990 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
139a0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
139b0 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
139c0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
139d0 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
139e0 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
139f0 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
13a00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13a10 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13a20 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13a30 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
13a70 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
13a80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13a90 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
13aa0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
13ab0 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
13ac0 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
13ad0 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
13ae0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
13af0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
13b00 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
13b10 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
13b20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
13b30 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
13b40 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
13b50 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
13b60 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
13b70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
13b80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
13b90 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
13ba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13bb0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
13bc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
13bd0 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
13be0 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
13bf0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
13c00 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
13c10 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
13c20 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
13c30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
13c40 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
13c50 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
13c60 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
13c70 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
13c80 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
13c90 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
13ca0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
13cb0 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
13cc0 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
13cd0 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
13ce0 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
13cf0 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
13d00 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
13d10 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
13d20 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
13d30 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
13d40 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
13d50 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
13d60 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
13d70 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
13d80 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
13d90 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
13da0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
13db0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
13dc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
13dd0 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
13de0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
13df0 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
13e00 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
13e10 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
13e20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
13e30 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
13e40 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
13e50 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
13e60 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
13e70 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
13e80 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
13e90 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
13ea0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
13eb0 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
13ec0 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
13ed0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
13ee0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
13ef0 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
13f00 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
13f10 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
13f20 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
13f30 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
13f40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
13f50 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
13f60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
13f70 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
13f80 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
13f90 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
13fa0 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
13fb0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61  pBt->nPage = nPa
13fc0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
13fd0 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
13fe0 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
13ff0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
14000 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
14010 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
14020 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
14030 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
14040 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
14050 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
14060 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
14070 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
14080 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
14090 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
140a0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
140b0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
140c0 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
140d0 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
140e0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
140f0 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
14100 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
14110 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
14120 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
14130 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
14140 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
14150 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
14160 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
14170 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
14180 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
14190 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
141a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
141b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
141c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
141d0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c  Bt->pCursor==0 |
141e0 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
141f0 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
14200 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
14210 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14220 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
14230 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
14240 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
14250 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
14260 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14270 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
14280 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
14290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
142a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
142b0 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
142c0 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
142d0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
142e0 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
142f0 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e  *.** If pBt poin
14300 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66  ts to an empty f
14310 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ile then convert
14320 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65   that empty file
14330 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65  .** into a new e
14340 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62 79  mpty database by
14350 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
14360 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a  e first page of.
14370 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ** the database.
14380 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
14390 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
143a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
143b0 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
143c0 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
143d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
143e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
143f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
14400 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
14410 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20  Bt->nPage>0 ){. 
14420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14430 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d  _OK;.  }.  pP1 =
14440 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
14450 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20 29  assert( pP1!=0 )
14460 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e  ;.  data = pP1->
14470 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71  aData;.  rc = sq
14480 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
14490 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  pP1->pDbPage);. 
144a0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
144b0 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61   rc;.  memcpy(da
144c0 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  ta, zMagicHeader
144d0 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48  , sizeof(zMagicH
144e0 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72  eader));.  asser
144f0 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  t( sizeof(zMagic
14500 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20  Header)==16 );. 
14510 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29   data[16] = (u8)
14520 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
14530 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  >8)&0xff);.  dat
14540 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42  a[17] = (u8)((pB
14550 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29  t->pageSize>>16)
14560 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
14570 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31  8] = 1;.  data[1
14580 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  9] = 1;.  assert
14590 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
145a0 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
145b0 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53   && pBt->usableS
145c0 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61  ize+255>=pBt->pa
145d0 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  geSize);.  data[
145e0 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e  20] = (u8)(pBt->
145f0 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
14600 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64  usableSize);.  d
14610 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20  ata[21] = 64;.  
14620 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20  data[22] = 32;. 
14630 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a   data[23] = 32;.
14640 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32    memset(&data[2
14650 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a  4], 0, 100-24);.
14660 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20    zeroPage(pP1, 
14670 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c  PTF_INTKEY|PTF_L
14680 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  EAF|PTF_LEAFDATA
14690 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53   );.  pBt->pageS
146a0 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69  izeFixed = 1;.#i
146b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
146c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
146d0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
146e0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
146f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
14700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
14710 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
14720 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
14730 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
14740 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
14750 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
14760 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
14770 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
14780 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
14790 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
147a0 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
147b0 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
147c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
147d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
147e0 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
147f0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
14800 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
14810 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
14820 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
14830 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
14840 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
14850 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
14860 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
14870 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
14880 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
14890 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
148a0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
148b0 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
148c0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
148d0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
148e0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
148f0 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
14900 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
14910 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
14920 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
14930 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
14940 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
14950 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
14960 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
14970 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
14980 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
14990 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
149a0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
149b0 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
149c0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
149d0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
149e0 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
149f0 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
14a00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
14a10 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
14a20 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
14a30 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
14a40 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
14a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
14a60 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
14a70 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14a80 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
14a90 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
14aa0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
14ab0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14ac0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
14ad0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
14ae0 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
14af0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
14b00 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
14b10 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14b20 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
14b30 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
14b40 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
14b50 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
14b60 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
14b70 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
14b80 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
14b90 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
14ba0 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
14bb0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
14bc0 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
14bd0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
14be0 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
14bf0 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
14c00 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
14c10 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
14c20 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
14c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
14c40 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
14c50 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
14c60 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
14c70 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
14c80 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
14c90 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
14ca0 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
14cb0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
14cc0 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
14cd0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
14ce0 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
14cf0 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
14d00 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
14d10 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
14d20 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
14d30 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
14d40 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
14d50 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
14d60 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
14d70 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
14d80 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
14d90 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
14da0 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
14db0 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
14dc0 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
14dd0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
14de0 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
14df0 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
14e00 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
14e10 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
14e20 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
14e30 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
14e40 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
14e50 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
14e60 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
14e70 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
14e80 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
14e90 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
14ea0 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
14eb0 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64   = 0;.  BtShared
14ec0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14ed0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14ee0 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E_OK;..  sqlite3
14ef0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
14f00 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
14f10 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
14f20 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64   btree is alread
14f30 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  y in a write-tra
14f40 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a  nsaction, or it.
14f50 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20    ** is already 
14f60 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  in a read-transa
14f70 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64  ction and a read
14f80 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a  -transaction.  *
14f90 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  * is requested, 
14fa0 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
14fb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
14fc0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
14fd0 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61  ITE || (p->inTra
14fe0 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26  ns==TRANS_READ &
14ff0 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20  & !wrflag) ){.  
15000 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
15010 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  un;.  }..  /* Wr
15020 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
15030 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
15040 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
15050 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
15060 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
15070 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
15080 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
15090 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
150a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
150b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
150c0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
150d0 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74  CHE.  /* If anot
150e0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
150f0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
15100 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
15110 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
15120 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
15130 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
15140 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
15150 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
15160 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
15170 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
15180 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69  LOCKED..  */.  i
15190 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
151a0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
151b0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c  ==TRANS_WRITE) |
151c0 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67  | pBt->isPending
151d0 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20 3d   ){.    pBlock =
151e0 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
151f0 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 77  b;.  }else if( w
15200 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42  rflag>1 ){.    B
15210 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20  tLock *pIter;.  
15220 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
15230 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
15240 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
15250 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
15260 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
15270 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b  {.        pBlock
15280 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
15290 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62 72  ->db;.        br
152a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
152b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 6c   }.  }.  if( pBl
152c0 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ock ){.    sqlit
152d0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
152e0 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63  ked(p->db, pBloc
152f0 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  k);.    rc = SQL
15300 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
15310 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74 6f  DCACHE;.    goto
15320 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
15330 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
15340 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
15350 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
15360 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
15370 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
15380 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
15390 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
153a0 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
153b0 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
153c0 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
153d0 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
153e0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
153f0 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
15400 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
15410 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
15420 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
15430 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
15440 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
15450 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
15460 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 69 6e 69  gun;..  pBt->ini
15470 74 69 61 6c 6c 79 45 6d 70 74 79 20 3d 20 28 75  tiallyEmpty = (u
15480 38 29 28 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30  8)(pBt->nPage==0
15490 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  );.  do {.    /*
154a0 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
154b0 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
154c0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
154d0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
154e0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
154f0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
15500 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
15510 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
15520 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
15530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
15540 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
15550 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
15560 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
15570 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
15580 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
15590 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
155a0 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
155b0 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
155c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
155d0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
155e0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
155f0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
15600 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
15610 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
15620 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
15630 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
15640 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
15650 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
15660 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
15670 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
15680 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
15690 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
156a0 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e   if( pBt->readOn
156b0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ly ){.        rc
156c0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
156d0 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
156e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
156f0 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28  lite3PagerBegin(
15700 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c  pBt->pPager,wrfl
15710 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70  ag>1,sqlite3Temp
15720 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29  InMemory(p->db))
15730 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15740 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15750 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
15760 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
15770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15780 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
15790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
157a0 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
157b0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
157c0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
157d0 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
157e0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
157f0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
15800 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
15810 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
15820 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
15830 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20  (pBt) );..  if( 
15840 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15850 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
15860 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
15870 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  ){.      pBt->nT
15880 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69  ransaction++;.#i
15890 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
158a0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
158b0 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72       if( p->shar
158c0 61 62 6c 65 20 29 7b 0a 09 61 73 73 65 72 74 28  able ){..assert(
158d0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
158e0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
158f0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
15900 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
15910 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
15920 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
15930 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
15940 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
15950 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
15960 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
15970 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
15980 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
15990 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
159a0 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
159b0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
159c0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
159d0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
159e0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
159f0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
15a00 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
15a10 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
15a20 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
15a30 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
15a40 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15a50 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
15a60 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
15a70 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
15a80 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
15a90 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73     pBt->isExclus
15aa0 69 76 65 20 3d 20 28 75 38 29 28 77 72 66 6c 61  ive = (u8)(wrfla
15ab0 67 3e 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  g>1);.#endif..  
15ac0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
15ad0 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
15ae0 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
15af0 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
15b00 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
15b10 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
15b20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
15b30 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
15b40 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
15b50 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
15b60 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
15b70 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
15b80 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
15b90 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
15ba0 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
15bb0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
15bc0 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
15bd0 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
15be0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
15bf0 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
15c00 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
15c10 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
15c20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
15c30 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
15c40 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
15c50 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
15c60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15c70 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
15c80 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
15c90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
15ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15cb0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
15cc0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
15cd0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
15ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15cf0 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
15d00 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
15d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
15d20 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
15d30 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
15d40 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
15d50 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
15d60 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
15d70 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
15d80 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
15d90 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
15da0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
15db0 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
15dc0 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
15dd0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
15de0 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
15df0 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
15e00 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
15e10 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
15e20 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
15e30 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
15e40 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
15e50 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
15e60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15e70 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15e80 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
15e90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15ea0 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
15eb0 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
15ec0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
15ed0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
15ee0 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
15ef0 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
15f00 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
15f10 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
15f20 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
15f30 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
15f40 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
15f50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
15f60 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
15f70 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
15f80 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
15f90 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15fc0 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
15fd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
15fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16000 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
16010 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
16020 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
16050 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
16060 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
16070 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
16080 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
16090 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
160a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
160b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
160c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
160d0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
160e0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
160f0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
16100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16110 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
16120 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
16130 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
16140 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
16150 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
16160 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
16170 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
16180 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
16190 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
161a0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
161b0 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
161c0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
161d0 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
161e0 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
161f0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
16200 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
16210 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
16220 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
16230 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
16240 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
16250 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
16260 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
16270 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
16280 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
16290 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
162a0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
162b0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
162c0 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
162d0 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
162e0 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
162f0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
16300 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
16310 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16320 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
16330 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
16340 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
16350 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
16360 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
16370 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
16380 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
16390 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
163a0 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
163b0 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
163c0 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
163d0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
163e0 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
163f0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
16400 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
16410 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
16420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16430 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
16440 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
16450 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
16460 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
16470 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
16480 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
16490 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
164a0 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
164b0 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
164c0 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
164d0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
164e0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
164f0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
16500 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
16510 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
16520 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
16540 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
16550 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
16560 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
16570 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
16580 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
16590 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
165a0 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
165b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
165c0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
165d0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
165e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
165f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
16600 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
16610 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
16620 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
16630 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
16640 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
16650 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
16660 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
16670 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
16680 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
16690 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
166a0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
166b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
166c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
166d0 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
166e0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
166f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
16700 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
16710 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
16720 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
16730 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62 74 72 65  nCell;..    btre
16740 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
16750 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
16760 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
16770 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
16780 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
16790 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
167a0 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
167b0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
167c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
167d0 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
167e0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
167f0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
16800 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
16810 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
16820 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
16830 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 20 26  rflow.         &
16840 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76  & pCell+info.iOv
16850 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61 67 65 2d  erflow+3<=pPage-
16860 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
16870 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
16880 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
16890 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
168a0 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20 20 20 20  Overflow]).     
168b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
168c0 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
168d0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
168e0 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
168f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16900 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
16910 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
16920 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
16930 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
16940 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
16950 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
16960 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
16970 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16980 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
16990 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
169a0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
169b0 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
169c0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
169d0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
169e0 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
169f0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
16a00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
16a10 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
16a20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
16a30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
16a40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
16a50 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
16a60 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
16a70 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
16a80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16a90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
16aa0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
16ab0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
16ac0 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
16ad0 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
16ae0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
16af0 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
16b00 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
16b10 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
16b20 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
16b30 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
16b40 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
16b50 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
16b60 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
16b70 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
16b80 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
16b90 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
16ba0 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
16bb0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
16bc0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
16bd0 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
16be0 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
16bf0 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
16c00 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
16c10 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
16c20 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
16c30 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
16c40 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
16c50 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
16c60 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
16c70 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16c90 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
16ca0 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
16cb0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
16cc0 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
16cd0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
16ce0 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
16cf0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
16d00 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
16d10 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
16d20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
16d30 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
16d40 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
16d50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
16d60 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
16d70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
16d80 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
16d90 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
16da0 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
16db0 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
16dc0 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
16dd0 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
16de0 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
16df0 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
16e00 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
16e10 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
16e20 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16e30 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
16e40 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
16e50 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
16e60 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
16e70 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
16e80 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
16e90 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
16ea0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16eb0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
16ec0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
16ed0 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
16ee0 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
16ef0 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
16f00 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
16f10 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
16f20 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
16f30 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
16f40 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
16f50 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
16f60 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
16f70 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
16f80 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
16f90 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
16fa0 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
16fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
16fc0 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
16fd0 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
16fe0 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
16ff0 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
17000 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17010 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17020 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
17030 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
17040 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
17050 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
17060 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
17070 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
17080 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
17090 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
170a0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
170b0 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
170c0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
170d0 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
170e0 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
170f0 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
17100 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
17110 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
17120 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
17130 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
17140 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
17150 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
17160 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
17170 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
17180 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
17190 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
171a0 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
171b0 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
171c0 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
171d0 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
171e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
171f0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
17200 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
17210 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
17220 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
17230 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
17240 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17250 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17260 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
17270 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
17280 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
17290 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
172a0 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
172b0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
172c0 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
172d0 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
172e0 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
172f0 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
17300 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17310 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
17320 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
17330 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
17340 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
17350 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
17360 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
17370 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
17380 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
17390 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
173a0 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
173b0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
173c0 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
173d0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
173e0 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
173f0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
17400 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
17410 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
17420 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
17430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
17450 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
17460 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
17470 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
17480 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
17490 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
174a0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
174b0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
174c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
174d0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
174e0 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
174f0 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
17500 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
17510 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
17520 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
17530 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
17540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17550 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
17560 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
17570 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
17580 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
17590 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
175a0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
175b0 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
175c0 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
175d0 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
175e0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
175f0 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
17600 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
17610 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
17620 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
17630 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
17640 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
17650 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
17660 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
17670 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
17680 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
17690 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
176a0 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
176b0 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
176c0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
176d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
176e0 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
176f0 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
17700 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
17710 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
17720 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
17730 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
17740 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
17750 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
17760 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
17770 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
17780 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
17790 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
177a0 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
177b0 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74  ion assumes.** t
177c0 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77  hat the caller w
177d0 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67  ill keep calling
177e0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
177f0 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65  ) until.** it re
17800 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
17810 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61  E or an error, a
17820 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20  nd that nFin is 
17830 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
17840 20 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62   pages the datab
17850 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f  ase file will co
17860 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73  ntain after this
17870 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20   .** process is 
17880 63 6f 6d 70 6c 65 74 65 2e 20 20 49 66 20 6e 46  complete.  If nF
17890 69 6e 20 69 73 20 7a 65 72 6f 2c 20 69 74 20 69  in is zero, it i
178a0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
178b0 2a 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  * incrVacuumStep
178c0 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  () will be calle
178d0 64 20 61 20 66 69 6e 69 74 65 20 61 6d 6f 75 6e  d a finite amoun
178e0 74 20 6f 66 20 74 69 6d 65 73 0a 2a 2a 20 77 68  t of times.** wh
178f0 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
17900 6f 74 20 65 6d 70 74 79 20 74 68 65 20 66 72 65  ot empty the fre
17910 65 6c 69 73 74 2e 20 20 41 20 66 75 6c 6c 20 61  elist.  A full a
17920 75 74 6f 76 61 63 75 75 6d 0a 2a 2a 20 68 61 73  utovacuum.** has
17930 20 6e 46 69 6e 3e 30 2e 20 20 41 20 22 50 52 41   nFin>0.  A "PRA
17940 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
17950 76 61 63 75 75 6d 22 20 68 61 73 20 6e 46 69 6e  vacuum" has nFin
17960 3d 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ==0..*/.static i
17970 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
17980 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
17990 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
179a0 20 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e   iLastPg){.  Pgn
179b0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
179c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
179d0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
179e0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
179f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
17a00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17a10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
17a20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
17a30 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
17a40 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
17a50 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
17a60 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
17a70 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
17a80 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
17a90 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
17aa0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
17ab0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
17ac0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
17ad0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
17ae0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
17af0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
17b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b10 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
17b20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
17b30 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
17b40 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
17b50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
17b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17b70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17b80 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
17b90 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
17ba0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
17bb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
17bc0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
17bd0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
17be0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
17bf0 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
17c00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
17c10 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
17c20 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
17c30 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
17c40 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
17c50 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
17c60 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
17c70 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
17c80 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
17c90 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
17ca0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
17cb0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
17cc0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
17cd0 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
17ce0 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
17cf0 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
17d00 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
17d10 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
17d20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
17d30 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
17d40 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
17d50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
17d60 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
17d70 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
17d80 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
17d90 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
17da0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17db0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
17dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
17dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
17de0 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
17df0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
17e00 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
17e10 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
17e20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
17e30 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
17e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17e50 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
17e60 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
17e70 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
17e80 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
17e90 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
17ea0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
17eb0 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
17ec0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
17ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ee0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
17ef0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
17f00 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
17f10 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
17f20 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
17f30 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
17f40 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
17f50 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
17f60 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
17f70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
17f80 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
17f90 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
17fa0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
17fb0 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
17fc0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
17fd0 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
17fe0 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
17ff0 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
18000 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
18010 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
18020 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
18030 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
18040 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
18050 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
18060 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
18070 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
18080 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
18090 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
180a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
180b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
180c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
180d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
180e0 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
180f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
18110 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
18120 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
18130 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
18140 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
18150 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
18160 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
18170 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
18180 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
18190 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
181a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
181b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
181c0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
181d0 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
181e0 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
181f0 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
18200 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
18210 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
18220 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
18230 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
18240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
18270 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
18280 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
18290 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
182a0 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
182b0 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
182c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
182d0 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
182e0 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
182f0 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
18300 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
18310 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
18320 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
18330 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
18340 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20  , &pPg, 0);.    
18350 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18370 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18390 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
183a0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
183b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
183c0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
183d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
183e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
183f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
18400 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
18410 20 20 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50    }.      iLastP
18420 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g--;.    }.    s
18430 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
18440 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
18450 61 67 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a  ager, iLastPg);.
18460 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
18470 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20   iLastPg;.  }.  
18480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
184a0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
184b0 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
184c0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
184d0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
184e0 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
184f0 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
18500 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
18510 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
18520 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
18530 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
18540 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
18550 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
18560 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
18570 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
18580 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
18590 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
185a0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
185b0 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
185c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
185d0 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
185e0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
185f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18600 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
18610 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
18620 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
18630 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
18640 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18650 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42  p);.  assert( pB
18660 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18670 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
18680 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
18690 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66  NS_WRITE );.  if
186a0 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ( !pBt->autoVacu
186b0 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
186c0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65  QLITE_DONE;.  }e
186d0 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  lse{.    invalid
186e0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
186f0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63  che(pBt);.    rc
18700 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
18710 70 28 70 42 74 2c 20 30 2c 20 62 74 72 65 65 50  p(pBt, 0, btreeP
18720 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b 0a  agecount(pBt));.
18730 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18750 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18760 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
18770 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
18780 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
18790 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
187a0 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
187b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
187c0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
187d0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
187e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
187f0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
18800 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
18810 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
18820 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
18830 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20 66  ** is commited f
18840 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
18850 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
18860 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
18870 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
18880 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
18890 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
188a0 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
188b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
188c0 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
188d0 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
188e0 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
188f0 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
18900 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
18910 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
18920 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
18930 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
18940 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
18950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
18960 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
18970 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
18980 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18990 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
189a0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
189b0 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
189c0 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
189d0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
189e0 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73  Pager) );..  ass
189f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
18a00 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
18a10 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
18a20 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
18a30 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
18a40 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
18a50 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
18a60 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
18a70 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
18a80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
18a90 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
18aa0 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
18ab0 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
18ac0 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
18ad0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18ae0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
18af0 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
18b00 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  */.    Pgno nPtr
18b10 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  map;      /* Num
18b20 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
18b30 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
18b40 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
18b50 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
18b60 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
18b70 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 69 6e   freed */.    in
18b80 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
18b90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
18ba0 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72  tries on one ptr
18bb0 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  map page */.    
18bc0 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20  Pgno nOrig;     
18bd0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
18be0 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69  ize before freei
18bf0 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67  ng */..    nOrig
18c00 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e   = btreePagecoun
18c10 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  t(pBt);.    if( 
18c20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
18c30 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72  t, nOrig) || nOr
18c40 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ig==PENDING_BYTE
18c50 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
18c60 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74      /* It is not
18c70 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65   possible to cre
18c80 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ate a database f
18c90 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e  or which the fin
18ca0 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  al page.      **
18cb0 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69   is either a poi
18cc0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72  nter-map page or
18cd0 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74   the pending-byt
18ce0 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20  e page. If one. 
18cf0 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75       ** is encou
18d00 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64  ntered, this ind
18d10 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f  icates corruptio
18d20 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
18d30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18d40 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
18d50 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d    }..    nFree =
18d60 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
18d70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
18d80 5d 29 3b 0a 20 20 20 20 6e 45 6e 74 72 79 20 3d  ]);.    nEntry =
18d90 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18da0 2f 35 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20  /5;.    nPtrmap 
18db0 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
18dc0 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
18dd0 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
18de0 2f 6e 45 6e 74 72 79 3b 0a 20 20 20 20 6e 46 69  /nEntry;.    nFi
18df0 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
18e00 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  e - nPtrmap;.   
18e10 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49   if( nOrig>PENDI
18e20 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
18e30 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e  ) && nFin<PENDIN
18e40 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
18e50 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
18e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
18e70 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
18e80 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
18e90 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
18ea0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
18eb0 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
18ec0 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e   }.    if( nFin>
18ed0 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
18ee0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18ef0 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72  PT;..    for(iFr
18f00 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e  ee=nOrig; iFree>
18f10 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  nFin && rc==SQLI
18f20 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b  TE_OK; iFree--){
18f30 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72  .      rc = incr
18f40 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
18f50 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20  nFin, iFree);.  
18f60 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d    }.    if( (rc=
18f70 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20  =SQLITE_DONE || 
18f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26  rc==SQLITE_OK) &
18f90 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  & nFree>0 ){.   
18fa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18fb0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
18fc0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
18fd0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
18fe0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
18ff0 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20  ata[32], 0);.   
19000 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
19010 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
19020 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  36], 0);.      p
19030 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
19040 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
19050 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 73 71   nFin);.      sq
19060 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
19070 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61  teImage(pBt->pPa
19080 67 65 72 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  ger, nFin);.    
19090 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
190a0 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
190b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
190c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
190d0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
190e0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
190f0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
19100 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
19110 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
19120 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19130 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
19140 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
19150 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
19160 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
19170 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
19180 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
19190 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
191a0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
191b0 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
191c0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
191d0 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
191e0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
191f0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
19200 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
19210 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
19220 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
19230 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
19240 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
19250 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
19260 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
19270 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
19280 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
19290 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
192a0 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
192b0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
192c0 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
192d0 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
192e0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
192f0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
19300 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
19310 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
19320 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
19330 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
19340 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
19350 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
19360 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
19370 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
19380 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
19390 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
193a0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
193b0 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
193c0 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
193d0 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
193e0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
193f0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
19400 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
19410 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
19420 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
19430 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
19440 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
19450 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
19460 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
19470 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
19480 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
19490 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
194a0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
194b0 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
194c0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
194d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
194e0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
194f0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
19500 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
19510 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
19520 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
19530 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
19540 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
19550 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
19560 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
19570 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
19580 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
19590 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
195a0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
195b0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
195c0 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
195d0 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
195e0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
195f0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
19600 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
19610 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
19620 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
19630 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
19640 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
19650 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
19660 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
19670 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
19680 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
19690 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
196a0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
196b0 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
196c0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
196d0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
196e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
196f0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
19700 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
19710 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
19720 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
19730 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
19740 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
19750 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
19760 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
19770 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
19780 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
19790 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
197a0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
197b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
197c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
197d0 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
197e0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
197f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
19810 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19820 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
19830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
19840 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
19850 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
19860 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
19870 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
19880 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
19890 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
198a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
198b0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
198c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
198d0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
198e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
198f0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
19900 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
19910 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
19920 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
19930 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
19940 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
19950 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
19960 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19970 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
19980 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
19990 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 62 74 72  tex(p) );..  btr
199a0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
199b0 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70 2d  t(pBt);.  if( p-
199c0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
199d0 4f 4e 45 20 26 26 20 70 2d 3e 64 62 2d 3e 61 63  ONE && p->db->ac
199e0 74 69 76 65 56 64 62 65 43 6e 74 3e 31 20 29 7b  tiveVdbeCnt>1 ){
199f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
19a00 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69 76   are other activ
19a10 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  e statements tha
19a20 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73  t belong to this
19a30 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
19a40 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61   handle, downgra
19a50 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  de to a read-onl
19a60 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  y transaction. T
19a70 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  he other stateme
19a80 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73  nts.    ** may s
19a90 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20  till be reading 
19aa0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
19ab0 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67  e.  */.    downg
19ac0 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
19ad0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
19ae0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
19af0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
19b00 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
19b10 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
19b20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
19b30 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
19b40 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
19b50 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
19b60 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
19b70 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
19b80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
19b90 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
19ba0 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
19bb0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
19bc0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
19bd0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
19be0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
19bf0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
19c00 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
19c10 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
19c20 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
19c30 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
19c40 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
19c50 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
19c60 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
19c70 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
19c80 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
19c90 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
19ca0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
19cb0 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
19cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19cd0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
19ce0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
19cf0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
19d00 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
19d10 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
19d20 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
19d30 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
19d40 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
19d50 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
19d60 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
19d70 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
19d80 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
19d90 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
19da0 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
19db0 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
19dc0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
19dd0 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
19de0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
19df0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19e00 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
19e10 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
19e20 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
19e30 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
19e40 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
19e50 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
19e60 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
19e70 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
19e80 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
19e90 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
19ea0 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
19eb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
19ec0 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
19ed0 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
19ee0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
19ef0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
19f00 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
19f10 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
19f20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
19f30 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
19f40 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
19f50 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
19f60 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
19f70 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
19f80 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
19f90 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
19fa0 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
19fb0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
19fc0 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
19fd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
19fe0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
19ff0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
1a000 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
1a010 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1a020 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c  hile the pager l
1a030 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74 69  ayer is attempti
1a040 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69  ng to .** finali
1a050 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ze the underlyin
1a060 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  g journal file, 
1a070 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1a080 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61  turns an error a
1a090 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20  nd.** the upper 
1a0a0 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d  layer will attem
1a0b0 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48  pt a rollback. H
1a0c0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20 73  owever, if the s
1a0d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a  econd argument.*
1a0e0 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68  * is non-zero th
1a0f0 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20 74  en this b-tree t
1a100 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61  ransaction is pa
1a110 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69  rt of a multi-fi
1a120 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  le .** transacti
1a130 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  on. In this case
1a140 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1a150 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
1a160 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a  en committed .**
1a170 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20   (by deleting a 
1a180 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1a190 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c  ile) and the cal
1a1a0 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20  ler will ignore 
1a1b0 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
1a1c0 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20  ns return code. 
1a1d0 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65  So, even if an e
1a1e0 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
1a1f0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a  he pager layer,.
1a200 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d 74  ** reset the b-t
1a210 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65  ree objects inte
1a220 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e  rnal state to in
1a230 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1a240 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63  write.** transac
1a250 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c  tion has been cl
1a260 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71 75  osed. This is qu
1a270 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68 65  ite safe, as the
1a280 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65   pager will have
1a290 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64  .** transitioned
1a2a0 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74   to the error st
1a2b0 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
1a2c0 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
1a2d0 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
1a2e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1a2f0 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
1a300 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
1a310 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
1a320 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
1a330 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
1a340 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1a350 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
1a360 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b  , int bCleanup){
1a370 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
1a380 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1a390 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a3a0 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  K;.  sqlite3Btre
1a3b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1a3c0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1a3d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e  .  /* If the han
1a3e0 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d  dle has a write-
1a3f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1a400 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61  , commit the sha
1a410 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a  red-btrees .  **
1a420 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
1a430 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20   set the shared 
1a440 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52  state to TRANS_R
1a450 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  EAD..  */.  if( 
1a460 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1a470 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1a480 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61  nt rc;.    BtSha
1a490 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1a4a0 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
1a4b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1a4c0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
1a4d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
1a4e0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
1a4f0 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 );.    rc = sq
1a500 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1a510 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50  PhaseTwo(pBt->pP
1a520 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1a530 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1a540 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20  bCleanup==0 ){. 
1a550 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a560 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
1a570 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a580 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
1a590 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
1a5a0 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 62 74  _READ;.  }..  bt
1a5b0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1a5c0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1a5d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1a5e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a5f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
1a600 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
1a610 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
1a620 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1a630 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1a640 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1a650 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a660 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1a670 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1a680 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1a690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a6a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1a6b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1a6c0 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
1a6d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1a6e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1a6f0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1a700 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
1a710 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
1a720 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
1a730 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
1a740 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
1a750 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
1a760 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
1a770 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
1a780 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
1a790 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
1a7a0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
1a7b0 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
1a7c0 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
1a7d0 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
1a7e0 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
1a7f0 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
1a800 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
1a810 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
1a820 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
1a830 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
1a840 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
1a850 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
1a860 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
1a870 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
1a880 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
1a890 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
1a8a0 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
1a8b0 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
1a8c0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
1a8d0 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
1a8e0 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
1a8f0 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
1a900 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
1a910 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
1a920 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
1a930 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
1a940 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
1a950 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
1a960 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
1a970 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a980 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1a990 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
1a9a0 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
1a9b0 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
1a9c0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
1a9d0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
1a9e0 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
1a9f0 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
1aa00 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
1aa10 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
1aa20 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
1aa30 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
1aa40 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
1aa50 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1aa60 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
1aa70 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
1aa80 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
1aa90 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
1aaa0 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
1aab0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
1aac0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
1aad0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
1aae0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
1aaf0 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
1ab00 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
1ab10 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
1ab20 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
1ab30 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
1ab40 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
1ab50 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
1ab60 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
1ab70 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
1ab80 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
1ab90 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
1aba0 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
1abb0 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
1abc0 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
1abd0 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
1abe0 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
1abf0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1ac00 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
1ac10 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
1ac20 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
1ac30 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
1ac40 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1ac50 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
1ac60 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
1ac70 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1ac80 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1ac90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1aca0 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
1acb0 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
1acc0 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
1acd0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
1ace0 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
1acf0 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
1ad00 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1ad10 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
1ad20 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
1ad30 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
1ad40 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1ad50 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1ad60 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
1ad70 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
1ad80 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1ad90 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
1ada0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
1adb0 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
1adc0 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
1add0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
1ade0 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
1adf0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
1ae00 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
1ae10 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
1ae20 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
1ae30 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
1ae40 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1ae50 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1ae60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ae70 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1ae80 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1ae90 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1aea0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1aeb0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1aec0 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
1aed0 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
1aee0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
1aef0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1af00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1af10 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
1af20 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1af30 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1af40 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1af50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1af60 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1af70 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1af80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
1af90 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
1afa0 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
1afb0 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
1afc0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
1afd0 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
1afe0 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
1aff0 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
1b000 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
1b010 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
1b020 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
1b030 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
1b040 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
1b050 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
1b060 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
1b070 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
1b080 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
1b090 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
1b0a0 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
1b0b0 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
1b0c0 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
1b0d0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
1b0e0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
1b0f0 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
1b100 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
1b110 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
1b120 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
1b130 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
1b140 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
1b150 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
1b160 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1b170 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
1b180 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
1b190 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
1b1a0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1b1b0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
1b1c0 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
1b1d0 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
1b1e0 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
1b1f0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
1b200 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
1b210 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
1b220 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
1b230 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b240 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
1b250 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
1b260 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
1b270 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
1b280 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
1b290 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
1b2a0 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61   call btreeGetPa
1b2b0 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61  ge() on page 1 a
1b2c0 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20  gain to make.   
1b2d0 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d   ** sure pPage1-
1b2e0 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f  >aData is set co
1b2f0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
1b300 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65  if( btreeGetPage
1b310 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
1b320 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 0)==SQLITE_OK 
1b330 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61  ){.      int nPa
1b340 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
1b350 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
1b360 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ata);.      test
1b370 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29  case( nPage==0 )
1b380 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67  ;.      if( nPag
1b390 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61  e==0 ) sqlite3Pa
1b3a0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1b3b0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
1b3c0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1b3d0 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e  e( pBt->nPage!=n
1b3e0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42  Page );.      pB
1b3f0 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
1b400 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1b410 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
1b420 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
1b430 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
1b440 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
1b450 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b460 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
1b470 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1b480 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1b490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b4a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b4b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
1b4c0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
1b4d0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1b4e0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1b4f0 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f  on can can be ro
1b500 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
1b510 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
1b520 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
1b530 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
1b540 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
1b550 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
1b560 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
1b570 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
1b580 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
1b590 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
1b5a0 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
1b5b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
1b5c0 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
1b5d0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
1b5e0 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
1b5f0 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
1b600 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
1b610 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
1b620 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
1b630 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
1b640 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
1b650 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
1b660 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
1b670 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
1b680 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
1b690 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
1b6a0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
1b6b0 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
1b6c0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1b6d0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
1b6e0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
1b6f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
1b700 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
1b710 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
1b720 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
1b730 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
1b740 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
1b750 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1b760 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
1b770 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1b780 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
1b790 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
1b7a0 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
1b7b0 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
1b7c0 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
1b7d0 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
1b7e0 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
1b7f0 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
1b800 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
1b810 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
1b820 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
1b830 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
1b840 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
1b850 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
1b860 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
1b870 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
1b880 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
1b890 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
1b8a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
1b8b0 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
1b8c0 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
1b8d0 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
1b8e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1b8f0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1b900 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b910 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
1b920 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1b930 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
1b940 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20  Bt->readOnly==0 
1b950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1b960 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
1b970 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
1b980 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
1b990 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
1b9a0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1b9b0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1b9c0 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
1b9d0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
1b9e0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1b9f0 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
1ba00 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
1ba10 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
1ba20 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
1ba30 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
1ba40 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
1ba50 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
1ba60 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
1ba70 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
1ba80 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
1ba90 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
1baa0 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
1bab0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
1bac0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
1bad0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
1bae0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1baf0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
1bb00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
1bb10 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
1bb20 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1bb30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bb40 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
1bb50 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1bb60 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
1bb70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
1bb80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
1bb90 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
1bba0 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
1bbb0 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
1bbc0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
1bbd0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
1bbe0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
1bbf0 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
1bc00 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
1bc10 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
1bc20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
1bc30 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
1bc40 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
1bc50 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1bc60 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
1bc70 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
1bc80 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
1bc90 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
1bca0 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
1bcb0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1bcc0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
1bcd0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
1bce0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
1bcf0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
1bd00 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
1bd10 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
1bd20 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
1bd30 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
1bd40 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
1bd50 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
1bd60 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
1bd70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1bd80 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
1bd90 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
1bda0 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
1bdb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1bdc0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
1bdd0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1bde0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
1bdf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1be00 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1be10 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
1be20 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
1be30 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1be40 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
1be50 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
1be60 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
1be70 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
1be80 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
1be90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1bea0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
1beb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1bec0 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  erSavepoint(pBt-
1bed0 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61  >pPager, op, iSa
1bee0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66  vepoint);.    if
1bef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bf00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61  ){.      if( iSa
1bf10 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 70 42 74  vepoint<0 && pBt
1bf20 2d 3e 69 6e 69 74 69 61 6c 6c 79 45 6d 70 74 79  ->initiallyEmpty
1bf30 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20   ) pBt->nPage = 
1bf40 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65  0;.      rc = ne
1bf50 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
1bf60 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1bf70 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
1bf80 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
1bf90 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
1bfa0 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
1bfb0 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
1bfc0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
1bfd0 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
1bfe0 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
1bff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1c000 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
1c010 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
1c020 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
1c030 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
1c040 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1c050 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
1c060 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1c070 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1c080 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1c090 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
1c0a0 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
1c0b0 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
1c0c0 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
1c0d0 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
1c0e0 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
1c0f0 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
1c100 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
1c110 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
1c120 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
1c130 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
1c140 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
1c150 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
1c160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
1c170 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
1c180 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
1c190 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
1c1a0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
1c1b0 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
1c1c0 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
1c1d0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
1c1e0 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
1c1f0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
1c200 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
1c210 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
1c220 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
1c230 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
1c240 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
1c250 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
1c260 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
1c270 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
1c280 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
1c290 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
1c2a0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
1c2b0 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
1c2c0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
1c2d0 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
1c2e0 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
1c2f0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
1c300 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
1c310 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
1c320 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
1c330 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1c340 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
1c350 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
1c360 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
1c370 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
1c380 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
1c390 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
1c3a0 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
1c3b0 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
1c3c0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
1c3d0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
1c3e0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
1c3f0 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
1c400 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
1c410 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
1c420 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
1c430 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
1c440 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
1c450 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
1c460 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
1c470 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
1c480 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
1c490 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
1c4a0 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
1c4b0 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
1c4c0 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
1c4d0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
1c4e0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
1c4f0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1c500 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
1c510 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
1c520 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
1c530 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
1c540 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
1c550 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
1c560 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
1c570 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
1c580 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1c590 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
1c5a0 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29  treeCursorZero()
1c5b0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1c5c0 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69  .** on pCur to i
1c5d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65  nitialize the me
1c5e0 6d 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72  mory space prior
1c5f0 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
1c600 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  s routine..*/.st
1c610 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75  atic int btreeCu
1c620 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
1c630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c650 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
1c660 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c680 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
1c690 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
1c6a0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
1c6b0 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6d0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1c6e0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1c6f0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1c700 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1c710 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1c720 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69  t arg to compari
1c730 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  son function */.
1c740 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
1c770 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72  e for new cursor
1c780 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
1c790 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7b0 2f 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65  /* Shared b-tree
1c7c0 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a 20 20 61 73   handle */..  as
1c7d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1c7e0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1c7f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
1c800 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c 61 67  lag==0 || wrFlag
1c810 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  ==1 );..  /* The
1c820 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1c830 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72  t statements ver
1c840 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69 73  ify that if this
1c850 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a   is a sharable .
1c860 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61    ** b-tree data
1c870 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63  base, the connec
1c880 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20  tion is holding 
1c890 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62  the required tab
1c8a0 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20  le locks, .  ** 
1c8b0 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  and that no othe
1c8c0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
1c8d0 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
1c8e0 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20   that conflicts 
1c8f0 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20  with .  ** this 
1c900 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
1c910 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
1c920 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  heTableLock(p, i
1c930 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21  Table, pKeyInfo!
1c940 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29 20 29 3b  =0, wrFlag+1) );
1c950 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
1c960 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
1c970 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
1c980 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
1c990 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
1c9a0 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
1c9b0 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
1c9c0 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
1c9d0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
1c9e0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
1c9f0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
1ca00 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
1ca10 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1ca20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1ca30 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
1ca40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
1ca50 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72  ..  if( NEVER(wr
1ca60 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61  Flag && pBt->rea
1ca70 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65  dOnly) ){.    re
1ca80 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
1ca90 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
1caa0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
1cab0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
1cac0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
1cad0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
1cae0 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
1caf0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
1cb00 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
1cb10 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
1cb20 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
1cb30 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
1cb40 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
1cb50 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
1cb60 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
1cb70 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
1cb80 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
1cb90 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
1cba0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
1cbb0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
1cbc0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1cbd0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
1cbe0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
1cbf0 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72 46  pBt;.  pCur->wrF
1cc00 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61 67  lag = (u8)wrFlag
1cc10 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20  ;.  pCur->pNext 
1cc20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
1cc30 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
1cc40 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70  t ){.    pCur->p
1cc50 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43  Next->pPrev = pC
1cc60 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70  ur;.  }.  pBt->p
1cc70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20  Cursor = pCur;. 
1cc80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1cc90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1cca0 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52 6f    pCur->cachedRo
1ccb0 77 69 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  wid = 0;.  retur
1ccc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
1ccd0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1cce0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
1ccf0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd10 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
1cd20 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
1cd30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
1cd60 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
1cd70 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
1cd80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cda0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
1cdb0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
1cdc0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
1cdd0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cdf0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
1ce00 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
1ce10 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1ce40 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
1ce50 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1ce60 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1ce70 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1ce80 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
1ce90 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
1cea0 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
1ceb0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1cec0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1ced0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1cee0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1cef0 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
1cf00 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
1cf10 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
1cf20 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
1cf30 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
1cf40 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
1cf50 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
1cf60 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
1cf70 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
1cf80 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
1cf90 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
1cfa0 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
1cfb0 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
1cfc0 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
1cfd0 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
1cfe0 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
1cff0 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
1d000 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
1d010 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
1d020 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
1d030 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
1d040 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
1d050 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
1d060 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
1d070 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
1d080 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
1d090 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
1d0a0 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
1d0b0 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
1d0c0 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
1d0d0 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
1d0e0 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
1d0f0 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
1d100 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
1d110 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
1d120 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
1d130 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
1d140 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
1d150 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
1d160 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
1d170 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
1d180 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
1d190 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
1d1a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1d1b0 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
1d1c0 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
1d1d0 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
1d1e0 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
1d1f0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
1d200 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76 61   cached rowid va
1d210 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75 72  lue of every cur
1d220 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20  sor in the same 
1d230 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
1d240 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61 76   as pCur and hav
1d250 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ing the same roo
1d260 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  t page number as
1d270 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75   pCur.  The valu
1d280 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69  e is.** set to i
1d290 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  Rowid..**.** Onl
1d2a0 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64  y positive rowid
1d2b0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1d2c0 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72  idered valid for
1d2d0 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20   this cache..** 
1d2e0 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 69  The cache is ini
1d2f0 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f  tialized to zero
1d300 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
1d310 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a  invalid cache..*
1d320 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77  * A btree will w
1d330 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65  ork fine with ze
1d340 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1d350 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20  owids.  We just 
1d360 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20  cannot.** cache 
1d370 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65  zero or negative
1d380 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d   rowids, which m
1d390 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74  eans tables that
1d3a0 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20   use zero or.** 
1d3b0 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73 20  negative rowids 
1d3c0 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74  might run a litt
1d3d0 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20  le slower.  But 
1d3e0 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72  in practice, zer
1d3f0 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65  o.** or negative
1d400 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72 79   rowids are very
1d410 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69   uncommon so thi
1d420 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
1d430 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
1d440 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  id sqlite3BtreeS
1d450 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1d460 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71  Cursor *pCur, sq
1d470 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77  lite3_int64 iRow
1d480 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  id){.  BtCursor 
1d490 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72  *p;.  for(p=pCur
1d4a0 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
1d4b0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
1d4c0 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
1d4d0 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  oot==pCur->pgnoR
1d4e0 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52  oot ) p->cachedR
1d4f0 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1d500 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1d510 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d  r->cachedRowid==
1d520 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a  iRowid );.}../*.
1d530 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 61  ** Return the ca
1d540 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74  ched rowid for t
1d550 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e  he given cursor.
1d560 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20    A negative or 
1d570 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76  zero.** return v
1d580 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20 74  alue indicates t
1d590 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63 61  hat the rowid ca
1d5a0 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61  che is invalid a
1d5b0 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  nd should be.** 
1d5c0 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65  ignored.  If the
1d5d0 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61 73   rowid cache has
1d5e0 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65   never before be
1d5f0 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a  en set, then a.*
1d600 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  * zero is return
1d610 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  ed..*/.sqlite3_i
1d620 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72 65  nt64 sqlite3Btre
1d630 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64 28  eGetCachedRowid(
1d640 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d650 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
1d660 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a  cachedRowid;.}..
1d670 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
1d680 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
1d690 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1d6a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
1d6b0 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
1d6c0 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
1d6d0 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
1d6e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
1d6f0 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
1d700 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
1d710 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
1d720 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
1d730 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74  Btree ){.    int
1d740 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64   i;.    BtShared
1d750 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1d760 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1d770 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
1d780 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1d790 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
1d7a0 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ur);.    if( pCu
1d7b0 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
1d7c0 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70    pCur->pPrev->p
1d7d0 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65  Next = pCur->pNe
1d7e0 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
1d7f0 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f       pBt->pCurso
1d800 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
1d810 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1d820 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
1d830 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d      pCur->pNext-
1d840 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70  >pPrev = pCur->p
1d850 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
1d860 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72  for(i=0; i<=pCur
1d870 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  ->iPage; i++){. 
1d880 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d890 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1d8a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c  );.    }.    unl
1d8b0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1d8c0 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c  (pBt);.    inval
1d8d0 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
1d8e0 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a  he(pCur);.    /*
1d8f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
1d900 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ur); */.    sqli
1d910 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
1d920 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
1d930 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d940 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1d950 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
1d960 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
1d970 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
1d980 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
1d990 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
1d9a0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
1d9b0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
1d9c0 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
1d9d0 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
1d9e0 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
1d9f0 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
1da00 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
1da10 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
1da20 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
1da30 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
1da40 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
1da50 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
1da60 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
1da70 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a  *.** 2007-06-25:
1da80 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67    There is a bug
1da90 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e   in some version
1daa0 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63  s of MSVC that c
1dab0 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70  ause the.** comp
1dac0 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68  iler to crash wh
1dad0 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29  en getCellInfo()
1dae0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
1daf0 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42  as a macro..** B
1db00 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65  ut there is a me
1db10 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20  asureable speed 
1db20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69  advantage to usi
1db30 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20  ng the macro on 
1db40 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73  gcc.** (when les
1db50 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d  s compiler optim
1db60 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f  izations like -O
1db70 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65  s or -O0 are use
1db80 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d  d and the.** com
1db90 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69  piler is not doi
1dba0 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c  ng agressive inl
1dbb0 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75  ining.)  So we u
1dbc0 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1dbd0 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61  on.** for MSVC a
1dbe0 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65  nd a macro for e
1dbf0 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20  verything else. 
1dc00 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a   Ticket #2457..*
1dc10 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1dc20 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61  .  static void a
1dc30 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74  ssertCellInfo(Bt
1dc40 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1dc50 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1dc60 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  ;.    int iPage 
1dc70 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
1dc80 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
1dc90 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
1dca0 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
1dcb0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1dcc0 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d  ge[iPage], pCur-
1dcd0 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26  >aiIdx[iPage], &
1dce0 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
1dcf0 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c  t( memcmp(&info,
1dd00 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69   &pCur->info, si
1dd10 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29  zeof(info))==0 )
1dd20 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
1dd30 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
1dd40 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23  Info(x).#endif.#
1dd50 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20  ifdef _MSC_VER. 
1dd60 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66   /* Use a real f
1dd70 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20  unction in MSVC 
1dd80 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62  to work around b
1dd90 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70  ugs in that comp
1dda0 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69  iler. */.  stati
1ddb0 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  c void getCellIn
1ddc0 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
1ddd0 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  r){.    if( pCur
1dde0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
1ddf0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 61  ){.      int iPa
1de00 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
1de10 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
1de20 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
1de30 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
1de40 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
1de50 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
1de60 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1de70 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
1de80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
1de90 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1dea0 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
1deb0 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
1dec0 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
1ded0 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
1dee0 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
1def0 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
1df00 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
1df10 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
1df20 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
1df30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1df60 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1df70 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
1df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1dfb0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1dfc0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20   pCur->iPage;   
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 5c 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  \.    btreeParse
1e010 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
1e020 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
1e030 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
1e040 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a 20 20 20 20  r->info); \.    
1e050 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1e060 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 1;            
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e090 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
1e0a0 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1e0f0 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
1e100 28 70 43 75 72 29 3b 20 20 20 20 20 20 20 20 20  (pCur);         
1e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1e140 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
1e150 43 5f 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65  C_VER */..#ifnde
1e160 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65  f NDEBUG  /* The
1e170 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73   next routine us
1e180 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61  ed only within a
1e190 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1e1a0 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ts */./*.** Retu
1e1b0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67  rn true if the g
1e1c0 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73  iven BtCursor is
1e1d0 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64   valid.  A valid
1e1e0 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a   cursor is one.*
1e1f0 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  * that is curren
1e200 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  tly pointing to 
1e210 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d  a row in a (non-
1e220 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a  empty) table..**
1e230 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66   This is a verif
1e240 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20  ication routine 
1e250 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  is used only wit
1e260 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
1e270 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20  tements..*/.int 
1e280 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
1e290 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73  orIsValid(BtCurs
1e2a0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
1e2b0 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72  urn pCur && pCur
1e2c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1e2d0 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66  _VALID;.}.#endif
1e2e0 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f   /* NDEBUG */../
1e2f0 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
1e300 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
1e310 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64  he buffer needed
1e320 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c   to hold the val
1e330 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ue of.** the key
1e340 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
1e350 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20   entry.  If the 
1e360 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
1e370 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
1e380 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69  alid entry, *pSi
1e390 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20  ze is set to 0. 
1e3a0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62  .**.** For a tab
1e3b0 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b  le with the INTK
1e3c0 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69  EY flag set, thi
1e3d0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1e3e0 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73  s the key.** its
1e3f0 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d  elf, not the num
1e400 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1e410 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54  the key..**.** T
1e420 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70  he caller must p
1e430 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73  osition the curs
1e440 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  or prior to invo
1e450 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
1e460 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  e..** .** This r
1e470 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
1e480 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  il.  It always r
1e490 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1e4a0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
1e4b0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
1e4c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1e4d0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  64 *pSize){.  as
1e4e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e4f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e500 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e510 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1e520 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  NVALID || pCur->
1e530 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e540 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70 43  ALID );.  if( pC
1e550 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1e560 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1e570 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 65  *pSize = 0;.  }e
1e580 6c 73 65 7b 0a 20 20 20 20 67 65 74 43 65 6c 6c  lse{.    getCell
1e590 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20  Info(pCur);.    
1e5a0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1e5b0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1e5c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e5d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
1e5e0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
1e5f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1e600 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
1e610 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
1e620 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1e630 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
1e640 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
1e650 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
1e660 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
1e670 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
1e680 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
1e690 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1e6a0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
1e6b0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
1e6c0 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
1e6d0 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
1e6e0 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
1e6f0 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
1e700 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
1e710 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
1e720 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
1e730 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
1e740 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
1e750 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
1e760 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
1e770 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
1e780 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
1e790 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
1e7a0 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
1e7b0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
1e7c0 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
1e7d0 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
1e7e0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1e7f0 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
1e800 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e810 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1e830 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1e840 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
1e850 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1e860 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
1e870 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 72  >info.nData;.  r
1e880 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1e8a0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e8b0 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
1e8c0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
1e8d0 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
1e8e0 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
1e8f0 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
1e900 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1e910 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1e920 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
1e930 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
1e940 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
1e950 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
1e960 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
1e970 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
1e980 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
1e990 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
1e9a0 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
1e9b0 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
1e9c0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1e9d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1e9e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1e9f0 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
1ea00 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
1ea10 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
1ea20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
1ea30 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
1ea40 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
1ea50 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
1ea60 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
1ea70 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1ea80 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
1ea90 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
1eaa0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
1eab0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
1eac0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
1ead0 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
1eae0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
1eaf0 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
1eb00 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
1eb10 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
1eb20 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
1eb30 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
1eb40 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
1eb50 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
1eb60 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
1eb70 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
1eb80 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
1eb90 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
1eba0 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
1ebb0 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
1ebc0 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
1ebd0 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
1ebe0 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
1ebf0 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
1ec00 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
1ec10 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
1ec20 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
1ec30 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
1ec40 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
1ec50 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
1ec60 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1ec70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
1ec80 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1ec90 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
1eca0 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
1ecb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
1ecc0 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1ecd0 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
1ece0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1ecf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1ed00 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
1ed10 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
1ed20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
1ed30 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
1ed40 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
1ed50 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1ed60 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
1ed70 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
1ed80 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1ed90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1eda0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1edb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1edc0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1edd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
1ede0 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
1edf0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ee00 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
1ee10 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
1ee20 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1ee30 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
1ee40 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
1ee50 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
1ee60 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
1ee70 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
1ee80 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
1ee90 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
1eea0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
1eeb0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
1eec0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
1eed0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
1eee0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
1eef0 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
1ef00 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
1ef10 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
1ef20 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
1ef30 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
1ef40 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1ef50 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
1ef60 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
1ef70 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
1ef80 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
1ef90 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
1efa0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1efb0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
1efc0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
1efd0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1efe0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
1eff0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
1f000 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
1f010 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
1f020 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1f030 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
1f040 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
1f050 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f060 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
1f070 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1f080 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
1f090 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
1f0a0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
1f0b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1f0c0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1f0d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
1f0e0 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
1f0f0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
1f100 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
1f110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f120 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1f130 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1f140 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1f150 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1f160 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
1f170 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1f180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f190 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
1f1a0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
1f1b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
1f1c0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
1f1d0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
1f1e0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
1f1f0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
1f200 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1f210 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
1f220 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
1f230 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
1f240 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
1f250 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
1f260 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
1f270 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
1f280 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
1f290 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
1f2a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1f2b0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
1f2c0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1f2d0 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
1f2e0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
1f2f0 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
1f300 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
1f310 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
1f320 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
1f330 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
1f340 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
1f350 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
1f360 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1f370 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1f380 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
1f390 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
1f3a0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
1f3b0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
1f3c0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
1f3d0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
1f3e0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
1f3f0 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
1f400 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
1f410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f420 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
1f430 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
1f440 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1f450 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
1f460 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
1f470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f480 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
1f490 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
1f4a0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
1f4b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f4c0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
1f4d0 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f4f0 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
1f500 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
1f510 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
1f520 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
1f530 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
1f540 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
1f550 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
1f560 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
1f570 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
1f580 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
1f590 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
1f5a0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
1f5b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f5c0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1f5d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f5e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f5f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
1f600 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
1f610 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
1f620 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
1f630 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
1f640 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
1f650 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
1f660 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
1f670 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
1f680 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
1f690 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1f6a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1f6b0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
1f6c0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
1f6d0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
1f6e0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
1f6f0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
1f700 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
1f710 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68  inting to. If th
1f720 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74  e eOp.** paramet
1f730 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69 73  er is 0, this is
1f740 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f   a read operatio
1f750 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 69  n (data copied i
1f760 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42  nto.** buffer pB
1f770 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  uf). If it is no
1f780 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20  n-zero, a write 
1f790 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f  (data copied fro
1f7a0 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  m.** buffer pBuf
1f7b0 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c  )..**.** A total
1f7c0 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20   of "amt" bytes 
1f7d0 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74  are read or writ
1f7e0 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ten beginning at
1f7f0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61   "offset"..** Da
1f800 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72  ta is read to or
1f810 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
1f820 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   pBuf..**.** The
1f830 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72   content being r
1f840 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d  ead or written m
1f850 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74  ight appear on t
1f860 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20  he main page.** 
1f870 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20  or be scattered 
1f880 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20  out on multiple 
1f890 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
1f8a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43  **.** If the BtC
1f8b0 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62  ursor.isIncrblob
1f8c0 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73  Handle flag is s
1f8d0 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72  et, and the curr
1f8e0 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e  ent.** cursor en
1f8f0 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
1f900 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
1f910 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ges, this functi
1f920 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20  on.** allocates 
1f930 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
1f940 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74  zily popluates t
1f950 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1f960 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20  -list .** cache 
1f970 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
1f980 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73  aOverflow). Subs
1f990 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
1f9a0 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74   this.** cache t
1f9b0 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
1f9c0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
1f9d0 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63  ffset more effic
1f9e0 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
1f9f0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1fa00 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
1fa10 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
1fa20 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
1fa30 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
1fa40 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
1fa50 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
1fa60 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
1fa70 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
1fa80 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
1fa90 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
1faa0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
1fab0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
1fac0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
1fad0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
1fae0 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
1faf0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
1fb00 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
1fb10 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1fb20 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
1fb30 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
1fb40 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
1fb50 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
1fb60 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
1fb70 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
1fb80 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
1fb90 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
1fba0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
1fbb0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
1fbc0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
1fbd0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
1fbe0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1fbf0 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
1fc00 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
1fc10 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
1fc20 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
1fc30 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
1fc40 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
1fc50 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
1fc60 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1fc70 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
1fc80 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
1fc90 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
1fca0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
1fcb0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
1fcc0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
1fcd0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
1fce0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1fcf0 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
1fd00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fd10 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
1fd20 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
1fd30 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1fd40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fd50 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
1fd60 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
1fd70 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
1fd80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fd90 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
1fda0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1fdb0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
1fdc0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20  belongs to */.. 
1fdd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
1fde0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1fdf0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1fe00 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1fe10 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1fe20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
1fe30 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
1fe40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1fe50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1fe60 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
1fe70 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
1fe80 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
1fe90 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66  Cell + pCur->inf
1fea0 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65  o.nHeader;.  nKe
1feb0 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  y = (pPage->intK
1fec0 65 79 20 3f 20 30 20 3a 20 28 69 6e 74 29 70 43  ey ? 0 : (int)pC
1fed0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  ur->info.nKey);.
1fee0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 6f 66 66  .  if( NEVER(off
1fef0 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
1ff00 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 29  Cur->info.nData)
1ff10 20 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61   .   || &aPayloa
1ff20 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
1ff30 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
1ff40 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
1ff50 53 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f  Size].  ){.    /
1ff60 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
1ff70 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
1ff80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
1ff90 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
1ffa0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1ffb0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1ffc0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
1ffd0 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
1ffe0 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
1fff0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
20000 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
20010 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
20020 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
20030 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
20040 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
20050 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
20060 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
20070 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
20080 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
20090 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
200a0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
200b0 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
200c0 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67  uf, a, eOp, pPag
200d0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
200e0 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
200f0 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
20100 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73  amt -= a;.  }els
20110 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d  e{.    offset -=
20120 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
20130 61 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  al;.  }..  if( r
20140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20150 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
20160 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
20170 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
20180 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
20190 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
201a0 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
201b0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
201c0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
201d0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
201e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
201f0 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
20200 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
20210 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
20220 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
20230 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
20240 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
20250 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
20260 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
20270 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
20280 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
20290 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
202a0 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
202b0 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
202c0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
202d0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
202e0 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
202f0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
20300 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
20310 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
20320 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
20330 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
20340 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
20350 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
20360 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
20370 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
20380 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
20390 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
203a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
203b0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
203c0 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
203d0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
203e0 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
203f0 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
20400 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
20410 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
20420 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
20430 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
20440 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
20450 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
20460 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
20470 20 20 20 20 20 20 2f 2a 20 6e 4f 76 66 6c 20 69        /* nOvfl i
20480 73 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69 76  s always positiv
20490 65 2e 20 20 49 66 20 69 74 20 77 65 72 65 20 7a  e.  If it were z
204a0 65 72 6f 2c 20 66 65 74 63 68 50 61 79 6c 6f 61  ero, fetchPayloa
204b0 64 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20  d would have.   
204c0 20 20 20 2a 2a 20 62 65 65 6e 20 75 73 65 64 20     ** been used 
204d0 69 6e 73 74 65 61 64 20 6f 66 20 74 68 69 73 20  instead of this 
204e0 72 6f 75 74 69 6e 65 2e 20 2a 2f 0a 20 20 20 20  routine. */.    
204f0 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 76    if( ALWAYS(nOv
20500 66 6c 29 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  fl) && !pCur->aO
20510 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
20520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
20530 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
20540 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
20550 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
20560 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
20570 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
20580 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
20590 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
205a0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
205b0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
205c0 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
205d0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
205e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
205f0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
20600 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
20610 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
20620 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
20630 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
20640 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
20650 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
20660 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
20670 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
20680 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
20690 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
206a0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
206b0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
206c0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
206d0 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
206e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
206f0 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
20700 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
20710 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
20720 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
20730 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
20740 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
20750 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
20760 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
20770 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
20780 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
20790 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
207a0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
207b0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
207c0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
207d0 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
207e0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
207f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
20800 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
20810 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
20820 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
20830 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
20840 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
20850 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
20860 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
20870 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
20880 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
20890 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
208a0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
208b0 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
208c0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
208d0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
208e0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
208f0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
20900 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
20910 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
20920 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
20930 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
20940 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
20950 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
20960 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
20970 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
20980 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
20990 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
209a0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
209b0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
209c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
209d0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
209e0 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
209f0 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
20a00 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
20a10 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
20a20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20a30 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
20a40 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
20a50 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
20a60 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
20a70 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
20a80 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
20a90 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
20aa0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
20ab0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
20ac0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
20ad0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
20ae0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
20af0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
20b00 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
20b10 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
20b20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
20b30 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
20b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
20b50 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
20b60 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
20b70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
20b80 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
20b90 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
20ba0 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
20bb0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
20bc0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
20bd0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
20be0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
20bf0 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
20c00 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
20c10 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
20c20 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
20c30 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
20c40 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
20c50 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
20c60 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
20c70 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
20c80 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
20c90 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
20ca0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
20cb0 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
20cc0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
20cd0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
20ce0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
20cf0 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
20d00 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
20d10 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
20d20 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
20d30 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
20d40 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
20d50 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
20d60 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
20d70 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
20d80 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
20d90 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
20da0 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
20db0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
20dc0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
20dd0 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20       if( eOp==0 
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
20e10 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
20e20 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
20e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e50 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
20e60 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e          && pBt->
20e70 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
20e80 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20  RANS_READ       
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ea0 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (4) */.        
20eb0 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65   && (fd = sqlite
20ec0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
20ed0 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f  pPager))->pMetho
20ee0 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f  ds     /* (3) */
20ef0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74  .         && pBt
20f00 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20f10 31 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20  19]==0x01       
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20  /* (5) */.      
20f40 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
20f50 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
20f60 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
20f70 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
20f80 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
20f90 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
20fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
20fb0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
20fc0 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
20fd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20  pBt->pageSize * 
20fe0 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
20ff0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
21000 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
21010 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
21020 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
21030 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
21040 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
21050 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
21060 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
21070 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
21080 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
21090 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
210a0 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
210b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
210c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
210d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
210e0 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69   aPayload = sqli
210f0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
21100 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21110 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
21120 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
21130 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ad);.           
21140 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
21150 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
21160 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20  et+4], pBuf, a, 
21170 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  eOp, pDbPage);. 
21180 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
21190 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
211a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
211b0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
211c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
211d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
211e0 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
211f0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
21200 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
21210 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21220 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
21230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
21240 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
21250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21260 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
21270 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
21280 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
21290 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
212a0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
212b0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
212c0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
212d0 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
212e0 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
212f0 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
21300 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
21310 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
21320 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
21330 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
21340 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
21350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
21360 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
21370 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
21380 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
21390 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
213a0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
213b0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
213c0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
213d0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
213e0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
213f0 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
21400 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
21410 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
21420 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
21430 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
21440 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
21450 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
21460 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
21470 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
21480 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
21490 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
214a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
214b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
214c0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
214d0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
214e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
214f0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
21500 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
21510 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
21520 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
21530 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
21540 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
21550 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
21560 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
21570 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
21580 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
21590 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
215a0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
215b0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
215c0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
215d0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
215e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
215f0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
21600 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
21610 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
21620 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
21630 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
21640 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
21650 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
21660 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
21670 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
21680 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
21690 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
216a0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
216b0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
216c0 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
216d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
216e0 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
216f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
21700 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
21710 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21720 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
21730 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
21740 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
21750 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
21760 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
21770 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
21780 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21790 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
217a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
217b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
217c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
217d0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
217e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
217f0 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
21800 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
21810 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
21820 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21830 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
21840 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
21850 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
21860 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
21870 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
21880 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
21890 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
218a0 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
218b0 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
218c0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
218d0 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
218e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
218f0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
21900 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
21910 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
21920 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
21930 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
21940 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
21950 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
21960 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
21970 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
21980 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
21990 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
219a0 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
219b0 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
219c0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
219d0 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
219e0 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
219f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
21a00 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
21a10 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
21a20 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
21a30 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
21a40 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
21a50 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
21a60 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
21a70 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
21a80 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
21a90 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
21aa0 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
21ab0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
21ac0 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
21ad0 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
21ae0 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
21af0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
21b00 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
21b10 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
21b20 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
21b30 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
21b40 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
21b50 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
21b60 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
21b70 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
21b80 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
21b90 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
21ba0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
21bb0 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
21bc0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
21bd0 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
21be0 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
21bf0 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
21c00 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
21c10 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
21c20 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
21c30 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
21c40 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
21c50 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
21c60 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
21c70 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
21c80 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
21c90 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
21ca0 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
21cb0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
21cc0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
21cd0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
21ce0 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
21cf0 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
21d00 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
21d10 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
21d20 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
21d30 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
21d40 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
21d50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
21d60 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32   u32 nKey;.  u32
21d70 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
21d80 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
21d90 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
21da0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21db0 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
21dc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
21dd0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
21de0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
21df0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
21e00 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
21e10 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
21e20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
21e30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
21e40 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
21e50 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
21e60 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
21e70 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
21e80 29 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61  ) ){.    btreePa
21e90 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
21ea0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21eb0 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  ], pCur->aiIdx[p
21ec0 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
21ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ee0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
21ef0 7d 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  }.  aPayload = p
21f00 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b  Cur->info.pCell;
21f10 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70  .  aPayload += p
21f20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
21f30 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  r;.  if( pPage->
21f40 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b  intKey ){.    nK
21f50 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 0;.  }else{
21f60 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69 6e 74  .    nKey = (int
21f70 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
21f80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70  ;.  }.  if( skip
21f90 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c  Key ){.    aPayl
21fa0 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
21fb0 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
21fc0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b  info.nLocal - nK
21fd0 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ey;.  }else{.   
21fe0 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
21ff0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20  info.nLocal;.   
22000 20 61 73 73 65 72 74 28 20 6e 4c 6f 63 61 6c 3c   assert( nLocal<
22010 3d 6e 4b 65 79 20 29 3b 0a 20 20 7d 0a 20 20 2a  =nKey );.  }.  *
22020 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20  pAmt = nLocal;. 
22030 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64   return aPayload
22040 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
22050 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
22060 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
22070 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
22080 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
22090 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
220a0 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
220b0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
220c0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
220d0 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
220e0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
220f0 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
22100 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
22110 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
22120 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
22130 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
22140 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
22150 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
22160 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
22170 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
22180 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
22190 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
221a0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
221b0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
221c0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
221d0 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
221e0 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
221f0 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
22200 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
22210 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
22220 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
22230 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
22240 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
22250 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
22260 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
22270 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
22280 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
22290 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
222a0 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
222b0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
222c0 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f  Amt){.  const vo
222d0 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73  id *p = 0;.  ass
222e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
222f0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
22300 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
22310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
22320 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22330 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c  Cur) );.  if( AL
22340 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74  WAYS(pCur->eStat
22350 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
22360 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e   ){.    p = (con
22370 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
22380 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
22390 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
223a0 72 6e 20 70 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  rn p;.}.const vo
223b0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
223c0 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
223d0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
223e0 41 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f  Amt){.  const vo
223f0 69 64 20 2a 70 20 3d 20 30 3b 0a 20 20 61 73 73  id *p = 0;.  ass
22400 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
22410 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
22420 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
22430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
22440 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22450 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 41 4c  Cur) );.  if( AL
22460 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74 61 74  WAYS(pCur->eStat
22470 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
22480 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 63 6f 6e   ){.    p = (con
22490 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
224a0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
224b0 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
224c0 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
224d0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
224e0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
224f0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
22500 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
22510 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
22520 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
22530 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
22540 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
22550 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
22560 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
22570 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
22580 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
22590 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
225a0 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
225b0 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
225c0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
225d0 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
225e0 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
225f0 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
22600 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
22610 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
22620 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
22630 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
22640 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
22650 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
22660 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72  ewPgno){.  int r
22670 63 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75  c;.  int i = pCu
22680 72 2d 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50  r->iPage;.  MemP
22690 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20  age *pNewPage;. 
226a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
226b0 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
226c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
226d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
226e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
226f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
22700 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
22710 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
22720 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
22730 48 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  H );.  if( pCur-
22740 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f  >iPage>=(BTCURSO
22750 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29  R_MAX_DEPTH-1) )
22760 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
22770 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22780 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
22790 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
227a0 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50   newPgno, &pNewP
227b0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
227c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
227d0 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
227e0 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
227f0 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
22800 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
22810 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
22820 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
22830 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
22840 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50  = 0;.  if( pNewP
22850 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  age->nCell<1 || 
22860 70 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79  pNewPage->intKey
22870 21 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  !=pCur->apPage[i
22880 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ]->intKey ){.   
22890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
228a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
228b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
228c0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
228d0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  NDEBUG./*.** Pag
228e0 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
228f0 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
22900 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
22910 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
22920 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
22930 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
22940 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
22950 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
22960 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
22970 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
22980 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
22990 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
229a0 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
229b0 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
229c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
229d0 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
229e0 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
229f0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
22a00 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
22a10 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
22a20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
22a30 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
22a40 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  {.  assert( iIdx
22a50 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
22a60 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
22a70 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
22a80 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
22a90 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
22aa0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
22ab0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
22ac0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
22ad0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
22ae0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
22af0 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
22b00 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
22b10 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
22b20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
22b30 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
22b40 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
22b50 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
22b60 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
22b70 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
22b80 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
22b90 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
22ba0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
22bb0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
22bc0 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
22bd0 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
22be0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
22bf0 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
22c00 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
22c10 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
22c20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
22c30 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
22c40 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
22c50 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
22c60 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
22c70 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
22c80 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
22c90 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
22ca0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
22cb0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22cc0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
22cd0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
22ce0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22cf0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22d00 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50  ge] );.  assertP
22d10 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
22d20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
22d30 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
22d40 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
22d50 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
22d60 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
22d70 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67  pCur->iPage]->pg
22d80 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73  no.  );.  releas
22d90 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
22da0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
22db0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  ;.  pCur->iPage-
22dc0 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  -;.  pCur->info.
22dd0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
22de0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
22df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
22e00 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
22e10 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  int to the root 
22e20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72  page of its b-tr
22e30 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ee structure..**
22e40 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
22e50 20 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72   has a virtual r
22e60 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74  oot page, then t
22e70 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
22e80 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  ed to point.** t
22e90 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  o the virtual ro
22ea0 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20  ot page instead 
22eb0 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  of the actual ro
22ec0 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65  ot page. A table
22ed0 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61   has a.** virtua
22ee0 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e  l root page when
22ef0 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74   the actual root
22f00 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
22f10 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a  o cells and a .*
22f20 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70  * single child p
22f30 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  age. This can on
22f40 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74  ly happen with t
22f50 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
22f60 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a  at page 1..**.**
22f70 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73   If the b-tree s
22f80 74 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74  tructure is empt
22f90 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  y, the cursor st
22fa0 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a  ate is set to .*
22fb0 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  * CURSOR_INVALID
22fc0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
22fd0 20 63 75 72 73 6f 72 20 69 73 20 73 65 74 20 74   cursor is set t
22fe0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  o point to the f
22ff0 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63  irst.** cell loc
23000 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74  ated on the root
23010 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f   (or virtual roo
23020 74 29 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  t) page and the 
23030 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20  cursor state.** 
23040 69 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52  is set to CURSOR
23050 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66  _VALID..**.** If
23060 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
23070 65 74 75 72 6e 73 20 73 75 63 63 65 73 73 66 75  eturns successfu
23080 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65 20 61  lly, it may be a
23090 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 0a  ssumed that the.
230a0 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  ** page-header f
230b0 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20 74 68  lags indicate th
230c0 61 74 20 74 68 65 20 5b 76 69 72 74 75 61 6c 5d  at the [virtual]
230d0 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 74 68   root-page is th
230e0 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b  e expected .** k
230f0 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20 70 61  ind of b-tree pa
23100 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68 65 6e  ge (i.e. if when
23110 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63 75 72   opening the cur
23120 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72 20 64  sor the caller d
23130 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66  id not.** specif
23140 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  y a KeyInfo stru
23150 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20  cture the flags 
23160 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30  byte is set to 0
23170 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20  x05 or 0x0D,.** 
23180 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74 61 62  indicating a tab
23190 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66  le b-tree, or if
231a0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
231b0 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66  specify a KeyInf
231c0 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  o .** structure 
231d0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
231e0 73 20 73 65 74 20 74 6f 20 30 78 30 32 20 6f 72  s set to 0x02 or
231f0 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74 69 6e   0x0A, indicatin
23200 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d  g an index.** b-
23210 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  tree)..*/.static
23220 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
23230 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23240 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
23250 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
23260 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
23270 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
23280 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
23290 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
232a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
232b0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
232c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
232d0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
232e0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
232f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
23300 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
23310 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
23320 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
23330 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
23340 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
23350 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
23360 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
23370 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
23380 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
23390 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
233a0 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  LT ){.      asse
233b0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
233c0 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
233d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43  .      return pC
233e0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
233f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
23400 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
23410 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
23420 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
23430 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
23440 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
23450 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
23460 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
23470 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
23480 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
23490 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b  pCur->iPage = 0;
234a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
234b0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
234c0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
234d0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
234e0 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
234f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
23500 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  se{.    rc = get
23510 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
23520 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
23530 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
23540 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
23550 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23560 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
23570 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
23580 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
23590 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
235a0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 0a 20  r->iPage = 0;.. 
235b0 20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70     /* If pCur->p
235c0 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
235d0 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
235e0 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
235f0 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 20   this cursor.   
23600 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
23610 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
23620 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
23630 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
23640 66 6f 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c  fo is.    ** NUL
23650 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78  L, the caller ex
23660 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d  pects a table b-
23670 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73  tree. If this is
23680 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20   not the case,. 
23690 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20     ** return an 
236a0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
236b0 72 72 6f 72 2e 20 20 2a 2f 0a 20 20 20 20 61 73  rror.  */.    as
236c0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
236d0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 31  ge[0]->intKey==1
236e0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
236f0 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  [0]->intKey==0 )
23700 3b 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  ;.    if( (pCur-
23710 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
23720 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
23730 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
23740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
23750 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
23760 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 65  }.  }..  /* Asse
23770 72 74 20 74 68 61 74 20 74 68 65 20 72 6f 6f 74  rt that the root
23780 20 70 61 67 65 20 69 73 20 6f 66 20 74 68 65 20   page is of the 
23790 63 6f 72 72 65 63 74 20 74 79 70 65 2e 20 54 68  correct type. Th
237a0 69 73 20 6d 75 73 74 20 62 65 20 74 68 65 0a 20  is must be the. 
237b0 20 2a 2a 20 63 61 73 65 20 61 73 20 74 68 65 20   ** case as the 
237c0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 66 75 6e  call to this fun
237d0 63 74 69 6f 6e 20 74 68 61 74 20 6c 6f 61 64 65  ction that loade
237e0 64 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  d the root-page 
237f0 28 65 69 74 68 65 72 0a 20 20 2a 2a 20 74 68 69  (either.  ** thi
23800 73 20 63 61 6c 6c 20 6f 72 20 61 20 70 72 65 76  s call or a prev
23810 69 6f 75 73 20 69 6e 76 6f 63 61 74 69 6f 6e 29  ious invocation)
23820 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74 65   would have dete
23830 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e 20  cted corruption 
23840 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 61 73 73  .  ** if the ass
23850 75 6d 70 74 69 6f 6e 20 77 65 72 65 20 6e 6f 74  umption were not
23860 20 74 72 75 65 2c 20 61 6e 64 20 69 74 20 69 73   true, and it is
23870 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
23880 72 20 74 68 65 20 66 6c 61 67 73 20 0a 20 20 2a  r the flags .  *
23890 2a 20 62 79 74 65 20 74 6f 20 68 61 76 65 20 62  * byte to have b
238a0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 77 68 69  een modified whi
238b0 6c 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 69  le this cursor i
238c0 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
238d0 72 65 6e 63 65 0a 20 20 2a 2a 20 74 6f 20 74 68  rence.  ** to th
238e0 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 70 52  e page.  */.  pR
238f0 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
23900 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
23910 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
23920 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
23930 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
23940 3e 69 73 49 6e 69 74 20 26 26 20 28 70 43 75 72  >isInit && (pCur
23950 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 3d 3d  ->pKeyInfo==0)==
23960 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 3b  pRoot->intKey );
23970 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
23980 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
23990 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
239a0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
239b0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
239c0 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
239d0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
239e0 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
239f0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
23a00 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
23a10 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
23a20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
23a30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
23a40 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
23a50 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
23a60 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
23a70 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
23a80 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
23a90 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
23aa0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
23ab0 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
23ac0 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
23ad0 65 53 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74  eState = ((pRoot
23ae0 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f  ->nCell>0)?CURSO
23af0 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49  R_VALID:CURSOR_I
23b00 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72  NVALID);.  }.  r
23b10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23b20 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
23b30 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
23b40 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
23b50 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
23b60 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
23b70 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
23b80 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
23b90 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
23ba0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
23bb0 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
23bc0 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
23bd0 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
23be0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
23bf0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
23c00 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
23c10 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
23c20 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
23c30 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
23c40 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
23c50 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23c60 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
23c70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
23c80 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23c90 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
23ca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23cb0 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
23cc0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23cd0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
23ce0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
23cf0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23d00 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
23d10 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
23d20 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
23d30 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
23d40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23d50 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
23d60 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
23d70 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
23d80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23d90 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
23da0 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
23db0 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
23dc0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
23dd0 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
23de0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
23df0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
23e00 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
23e10 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
23e20 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
23e30 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
23e40 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
23e50 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
23e60 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
23e70 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
23e80 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
23e90 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
23ea0 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
23eb0 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
23ec0 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
23ed0 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
23ee0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
23ef0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
23f00 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
23f10 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
23f20 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
23f30 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
23f40 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
23f50 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
23f60 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
23f70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23f80 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
23f90 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
23fa0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23fb0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23fc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23fd0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23fe0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
23ff0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
24000 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
24010 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24020 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
24030 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
24040 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
24050 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
24060 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
24070 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
24080 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
24090 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
240a0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
240b0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69  , pgno);.  }.  i
240c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
240d0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   ){.    pCur->ai
240e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
240f0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d   = pPage->nCell-
24100 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
24110 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
24120 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
24130 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
24140 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
24150 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
24160 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
24170 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
24180 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
24190 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
241a0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
241b0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
241c0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
241d0 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
241e0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
241f0 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
24200 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
24210 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
24220 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
24230 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
24240 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
24250 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
24260 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
24270 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
24280 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
24290 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
242a0 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  );.  rc = moveTo
242b0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
242c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
242d0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
242e0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
242f0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
24300 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
24310 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
24320 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
24330 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
24340 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
24350 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
24360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
24370 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24380 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
24390 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
243a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
243b0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
243c0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pCur);.    }.  }
243d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
243e0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
243f0 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20  sor to the last 
24400 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
24410 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
24420 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
24430 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
24440 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
24450 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
24460 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
24470 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
24480 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
24490 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
244a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  nt sqlite3BtreeL
244b0 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ast(BtCursor *pC
244c0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
244d0 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73    int rc;. .  as
244e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
244f0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
24500 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24510 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
24520 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
24530 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
24540 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72  f the cursor alr
24550 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  eady points to t
24560 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74  he last entry, t
24570 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  his is a no-op. 
24580 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  */.  if( CURSOR_
24590 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
245a0 61 74 65 20 26 26 20 70 43 75 72 2d 3e 61 74 4c  ate && pCur->atL
245b0 61 73 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ast ){.#ifdef SQ
245c0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
245d0 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72  * This block ser
245e0 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20  ves to assert() 
245f0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
24600 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e  really does poin
24610 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  t .    ** to the
24620 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
24630 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20  he b-tree. */.  
24640 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f    int ii;.    fo
24650 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d  r(ii=0; ii<pCur-
24660 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20  >iPage; ii++){. 
24670 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
24680 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43  r->aiIdx[ii]==pC
24690 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e  ur->apPage[ii]->
246a0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20  nCell );.    }. 
246b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
246c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
246d0 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ge]==pCur->apPag
246e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
246f0 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61  nCell-1 );.    a
24700 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
24710 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
24720 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66  ->leaf );.#endif
24730 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
24740 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63  TE_OK;.  }..  rc
24750 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
24760 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
24770 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24780 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
24790 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
247a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
247b0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
247c0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
247d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
247e0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
247f0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
24800 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24810 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
24820 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24830 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  ID );.      *pRe
24840 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
24850 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
24860 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
24870 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63  Cur->atLast = rc
24880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a 30  ==SQLITE_OK ?1:0
24890 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
248a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
248b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
248c0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
248d0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
248e0 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
248f0 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
24900 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
24910 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
24920 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
24930 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
24940 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
24950 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
24960 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
24970 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
24980 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
24990 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
249a0 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
249b0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
249c0 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
249d0 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
249e0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
249f0 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
24a00 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
24a10 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
24a20 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
24a30 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
24a40 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
24a50 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
24a60 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
24a70 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
24a80 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
24a90 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
24aa0 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
24ab0 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
24ac0 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
24ad0 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
24ae0 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
24af0 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
24b00 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
24b10 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
24b20 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
24b30 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
24b40 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
24b50 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
24b60 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
24b70 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
24b80 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
24b90 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
24ba0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
24bb0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
24bc0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
24bd0 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
24be0 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
24bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
24c00 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
24c10 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
24c20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
24c30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
24c40 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
24c50 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
24c60 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
24c70 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
24c80 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
24c90 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
24ca0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
24cb0 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
24cc0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
24cd0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
24ce0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d00 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
24d10 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
24d20 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
24d30 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
24d40 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
24d50 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
24d60 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
24d70 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
24d80 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
24d90 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
24da0 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
24db0 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24dd0 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
24de0 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
24df0 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
24e00 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
24e10 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
24e20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
24e30 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
24e40 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
24e50 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
24e60 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
24e70 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
24e80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
24e90 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
24ea0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
24eb0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
24ec0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
24ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
24ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
24ef0 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
24f00 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
24f10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
24f20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
24f30 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
24f40 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
24f50 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
24f60 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
24f70 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
24f80 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
24f90 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
24fa0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
24fb0 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
24fc0 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70  lidNKey .   && p
24fd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
24fe0 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
24ff0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
25000 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
25010 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
25020 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25030 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
25040 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c     if( pCur->atL
25050 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  ast && pCur->inf
25060 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
25070 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
25080 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
25090 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
250a0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
250b0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
250c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
250d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
250e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
250f0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
25100 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25110 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
25120 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
25130 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
25140 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
25150 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
25160 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25170 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
25180 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70  ALID || pCur->ap
25190 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
251a0 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
251b0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
251c0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
251d0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
251e0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
251f0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
25200 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
25210 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25220 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
25230 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25240 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
25250 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
25260 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b  >intKey || pIdxK
25270 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  ey );.  for(;;){
25280 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
25290 72 2c 20 69 64 78 3b 0a 20 20 20 20 50 67 6e 6f  r, idx;.    Pgno
252a0 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
252b0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
252c0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
252d0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
252e0 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   c;..    /* pPag
252f0 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
25300 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
25310 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
25320 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
25330 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
25340 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
25350 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
25360 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
25370 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
25380 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
25390 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
253a0 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
253b0 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
253c0 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
253d0 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
253e0 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
253f0 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
25400 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
25410 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
25420 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
25430 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
25440 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
25450 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
25460 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
25470 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
25480 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
25490 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
254a0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
254b0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
254c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
254d0 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
254e0 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
254f0 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
25500 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
25510 69 66 28 20 62 69 61 73 52 69 67 68 74 20 29 7b  if( biasRight ){
25520 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
25530 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
25540 3d 20 28 75 31 36 29 28 69 64 78 20 3d 20 75 70  = (u16)(idx = up
25550 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
25560 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
25570 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
25580 28 75 31 36 29 28 69 64 78 20 3d 20 28 75 70 72  (u16)(idx = (upr
25590 2b 6c 77 72 29 2f 32 29 3b 0a 20 20 20 20 7d 0a  +lwr)/2);.    }.
255a0 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
255b0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
255e0 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
255f0 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
25600 20 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78       assert( idx
25610 3d 3d 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ==pCur->aiIdx[pC
25620 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
25630 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
25640 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
25650 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
25660 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b 20 70  (pPage, idx) + p
25670 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
25680 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ze;.      if( pP
25690 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
256a0 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c 6c         i64 nCell
256b0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
256c0 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
256d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  ){.          u32
256e0 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20   dummy;.        
256f0 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74 56 61    pCell += getVa
25700 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20 64 75  rint32(pCell, du
25710 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  mmy);.        }.
25720 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e          getVarin
25730 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26  t(pCell, (u64*)&
25740 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  nCellKey);.     
25750 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3d     if( nCellKey=
25760 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  =intKey ){.     
25770 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
25780 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
25790 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  ellKey<intKey ){
257a0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
257b0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
257c0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
257d0 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74  rt( nCellKey>int
257e0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
257f0 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20   c = +1;.       
25800 20 7d 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d   }.        pCur-
25810 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a  >validNKey = 1;.
25820 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
25830 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
25840 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ey;.      }else{
25850 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
25860 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
25870 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
25880 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
25890 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
258a0 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
258b0 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
258c0 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
258d0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
258e0 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
258f0 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
25900 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
25910 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
25920 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
25930 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
25940 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
25950 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
25960 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
25970 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
25980 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
25990 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
259a0 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
259b0 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
259c0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
259d0 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
259e0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
259f0 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
25a00 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
25a10 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
25a20 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
25a30 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
25a40 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d  nCell = pCell[0]
25a50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 28  ;.        if( !(
25a60 6e 43 65 6c 6c 20 26 20 30 78 38 30 29 0a 20 20  nCell & 0x80).  
25a70 20 20 20 20 20 20 20 26 26 20 6e 43 65 6c 6c 3c         && nCell<
25a80 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
25a90 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 43  .         && (pC
25aa0 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 29 3c 3d 70 50  ell+nCell+1)<=pP
25ab0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 0a 20 20  age->aDataEnd.  
25ac0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
25ad0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
25ae0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
25af0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
25b00 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
25b10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
25b20 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
25b30 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
25b40 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
25b50 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
25b60 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
25b70 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
25b80 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
25b90 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
25ba0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
25bb0 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
25bc0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
25bd0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
25be0 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
25bf0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
25c00 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
25c10 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
25c20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
25c30 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
25c40 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
25c50 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
25c60 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  al.          && 
25c70 28 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 29 3c  (pCell+nCell+2)<
25c80 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  =pPage->aDataEnd
25c90 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
25ca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
25cb0 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69  ord-size field i
25cc0 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e  s a 2 byte varin
25cd0 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64  t and the record
25ce0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66   .          ** f
25cf0 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20  its entirely on 
25d00 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20  the main b-tree 
25d10 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
25d20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
25d30 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61  ell+nCell+2==pPa
25d40 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
25d50 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
25d60 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
25d70 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
25d80 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
25d90 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
25da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25db0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
25dc0 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
25dd0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
25de0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
25df0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
25e00 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
25e10 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
25e20 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
25e30 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
25e40 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
25e50 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
25e60 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
25e70 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
25e80 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
25e90 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
25ea0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
25eb0 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
25ec0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
25ed0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
25ee0 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
25ef0 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
25f00 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
25f10 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
25f20 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
25f30 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
25f40 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
25f50 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
25f60 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
25f70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
25f80 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
25f90 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
25fa0 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  oc( nCell );.   
25fb0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
25fc0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
25fd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25fe0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
25ff0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
26000 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
26010 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
26020 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
26030 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
26040 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
26050 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a  *)pCellKey, 0);.
26060 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26070 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26080 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
26090 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
260a0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
260b0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
260c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
260d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
260e0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
260f0 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78  , pCellKey, pIdx
26100 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
26110 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
26120 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
26130 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
26140 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20  if( c==0 ){.    
26150 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
26160 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
26170 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
26180 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
26190 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
261a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
261b0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
261c0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  0;.          rc 
261d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
261e0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
261f0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
26200 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26210 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20     if( c<0 ){.  
26220 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
26230 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
26240 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64          upr = id
26250 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  x-1;.      }.   
26260 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
26270 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
26280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
26290 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
262a0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28  >iPage] = (u16)(
262b0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
262c0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  2);.    }.    as
262d0 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31  sert( lwr==upr+1
262e0 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b   || (pPage->intK
262f0 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
26300 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  af) );.    asser
26310 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
26320 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
26330 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
26340 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
26350 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
26360 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
26370 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
26380 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
26390 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
263a0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
263b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
263c0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
263d0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
263e0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
263f0 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
26400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
26410 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26420 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
26430 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26440 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
26450 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20    *pRes = c;.   
26460 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
26470 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
26480 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
26490 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
264a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
264b0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
264c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
264d0 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e   = 0;.    pCur->
264e0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
264f0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
26500 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
26510 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
26520 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
26530 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  sh;.  }.moveto_f
26540 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20  inish:.  return 
26550 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
26560 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
26570 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
26580 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
26590 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
265a0 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
265b0 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
265c0 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
265d0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
265e0 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
265f0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
26600 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
26610 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
26620 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
26630 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
26640 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
26650 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
26660 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
26670 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
26680 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
26690 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
266a0 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
266b0 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
266c0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
266d0 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
266e0 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
266f0 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
26700 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
26710 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
26720 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
26730 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
26740 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
26750 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
26760 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
26770 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
26780 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
26790 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
267a0 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
267b0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
267c0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
267d0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
267e0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
267f0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
26800 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
26810 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
26820 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
26830 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
26840 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
26850 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
26860 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
26870 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
26880 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
26890 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
268a0 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
268b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
268c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
268d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
268e0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
268f0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
26900 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
26910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26920 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
26930 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
26940 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  Res!=0 );.  if( 
26950 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
26960 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
26970 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
26980 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26990 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
269a0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
269b0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
269c0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 2a  pNext = 0;.    *
269d0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65  pRes = 0;.    re
269e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
269f0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70    }.  pCur->skip
26a00 4e 65 78 74 20 3d 20 30 3b 0a 0a 20 20 70 50 61  Next = 0;..  pPa
26a10 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
26a20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
26a30 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
26a40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
26a50 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
26a60 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
26a70 20 61 73 73 65 72 74 28 20 69 64 78 3c 3d 70 50   assert( idx<=pP
26a80 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20  age->nCell );.. 
26a90 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
26aa0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
26ab0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
26ac0 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e  if( idx>=pPage->
26ad0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28  nCell ){.    if(
26ae0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
26af0 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
26b00 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
26b10 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
26b20 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
26b30 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
26b40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
26b50 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
26b60 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
26b70 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 52  pCur);.      *pR
26b80 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
26b90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
26ba0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28     do{.      if(
26bb0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
26bc0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
26bd0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
26be0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
26bf0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
26c00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
26c10 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
26c20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
26c30 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70  t(pCur);.      p
26c40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
26c50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
26c60 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43  ;.    }while( pC
26c70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
26c80 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e  iPage]>=pPage->n
26c90 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65  Cell );.    *pRe
26ca0 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  s = 0;.    if( p
26cb0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
26cc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26cd0 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
26ce0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
26cf0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
26d00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
26d10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26d20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a   }.  *pRes = 0;.
26d30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
26d40 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
26d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
26d60 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
26d70 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65  most(pCur);.  re
26d80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
26d90 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73  ** Step the curs
26da0 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74  or to the back t
26db0 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  o the previous e
26dc0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
26dd0 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
26de0 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
26df0 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
26e00 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
26e10 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
26e20 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
26e30 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
26e40 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ase before.** th
26e50 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63  is routine was c
26e60 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20  alled, then set 
26e70 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20  *pRes=1..*/.int 
26e80 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
26e90 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
26ea0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
26eb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
26ec0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
26ed0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26ee0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26ef0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
26f00 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
26f10 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
26f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26f30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
26f40 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
26f50 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   0;.  if( CURSOR
26f60 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
26f70 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
26f80 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
26f90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
26fa0 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
26fb0 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
26fc0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
26fd0 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
26fe0 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
26ff0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
27000 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
27010 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
27020 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27030 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65  ->iPage];.  asse
27040 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
27050 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  t );.  if( !pPag
27060 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69  e->leaf ){.    i
27070 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61  nt idx = pCur->a
27080 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27090 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  ];.    rc = move
270a0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65  ToChild(pCur, ge
270b0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
270c0 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20  pPage, idx)));. 
270d0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
270e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
270f0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76    }.    rc = mov
27100 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
27110 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
27120 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69   while( pCur->ai
27130 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27140 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
27150 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
27160 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
27170 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27180 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
27190 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
271a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
271b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
271c0 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e       moveToParen
271d0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
271e0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
271f0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
27200 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
27210 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  ;..    pCur->aiI
27220 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
27230 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
27240 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27250 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66  ->iPage];.    if
27260 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
27270 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
27280 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
27290 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
272a0 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  us(pCur, pRes);.
272b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
272c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
272d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52  .    }.  }.  *pR
272e0 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  es = 0;.  return
272f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
27300 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
27310 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
27320 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
27330 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
27340 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
27350 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
27360 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
27370 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
27380 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
27390 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
273a0 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
273b0 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
273c0 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
273d0 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
273e0 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
273f0 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
27400 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
27410 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
27420 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
27430 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
27440 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
27450 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
27460 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
27470 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
27480 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
27490 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50   *ppPage and *pP
274a0 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65  gno are undefine
274b0 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  d in the event o
274c0 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44  f an error..** D
274d0 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c  o not invoke sql
274e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
274f0 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61   on *ppPage if a
27500 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
27510 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ned..**.** If th
27520 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
27530 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
27540 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65  hen a (feeble) e
27550 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f  ffort is made to
27560 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61   .** locate a pa
27570 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20  ge close to the 
27580 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61  page number "nea
27590 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20  rby".  This can 
275a0 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a  be used in an.**
275b0 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70   attempt to keep
275c0 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63   related pages c
275d0 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68  lose to each oth
275e0 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
275f0 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63  se file,.** whic
27600 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61  h in turn can ma
27610 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ke database acce
27620 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  ss faster..**.**
27630 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20   If the "exact" 
27640 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
27650 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65   0, and the page
27660 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65  -number nearby e
27670 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65  xists .** anywhe
27680 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
27690 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
276a0 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65  guarenteed to be
276b0 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a   returned. This.
276c0 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  ** is only used 
276d0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
276e0 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c  atabases when al
276f0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74  locating a new t
27700 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
27710 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
27720 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
27730 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61  d *pBt, .  MemPa
27740 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20  ge **ppPage, .  
27750 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20  Pgno *pPgno, .  
27760 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75  Pgno nearby,.  u
27770 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d  8 exact.){.  Mem
27780 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
27790 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
277a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
277b0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
277c0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
277d0 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
277e0 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
277f0 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
27800 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
27810 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
27820 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
27830 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
27840 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
27850 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
27860 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
27870 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
27880 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
27890 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
278a0 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
278b0 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
278c0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
278d0 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20  count(pBt);.  n 
278e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
278f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
27900 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d    testcase( n==m
27910 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28  xPage-1 );.  if(
27920 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20   n>=mxPage ){.  
27930 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27940 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
27950 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
27960 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
27970 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
27980 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
27990 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
279a0 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
279b0 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
279c0 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
279d0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
279e0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
279f0 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
27a00 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
27a10 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
27a20 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
27a30 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
27a40 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
27a50 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
27a60 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
27a70 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
27a80 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
27a90 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
27aa0 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
27ab0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
27ac0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
27ad0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
27ae0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
27af0 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
27b00 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 6d 78 50  t && nearby<=mxP
27b10 61 67 65 20 29 7b 0a 20 20 20 20 20 20 75 38 20  age ){.      u8 
27b20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73  eType;.      ass
27b30 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b  ert( nearby>0 );
27b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
27b50 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
27b60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
27b70 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
27b80 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
27b90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
27ba0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
27bb0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
27bc0 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
27bd0 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
27be0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
27bf0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61      *pPgno = nea
27c00 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rby;.    }.#endi
27c10 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
27c20 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
27c30 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
27c40 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
27c50 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
27c60 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
27c70 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
27c80 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
27c90 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
27ca0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
27cb0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
27cc0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
27cd0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
27ce0 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
27cf0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
27d00 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
27d10 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
27d20 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
27d30 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
27d40 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
27d50 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
27d60 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
27d70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
27d80 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
27d90 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
27da0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
27db0 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
27dc0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
27dd0 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f   located..    */
27de0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
27df0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72  pPrevTrunk = pTr
27e00 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  unk;.      if( p
27e10 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
27e20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
27e30 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
27e40 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
27e50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27e60 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
27e70 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
27e80 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20  Data[32]);.     
27e90 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   }.      testcas
27ea0 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67  e( iTrunk==mxPag
27eb0 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  e );.      if( i
27ec0 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 0a  Trunk>mxPage ){.
27ed0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
27ee0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
27ef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27f00 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
27f10 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
27f20 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
27f30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
27f40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
27f50 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
27f60 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
27f70 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
27f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
27f90 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29  ert( pTrunk!=0 )
27fa0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27fb0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30  pTrunk->aData!=0
27fc0 20 29 3b 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67   );..      k = g
27fd0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
27fe0 3e 61 44 61 74 61 5b 34 5d 29 3b 20 2f 2a 20 23  >aData[4]); /* #
27ff0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
28000 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  is trunk page */
28010 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20  .      if( k==0 
28020 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20 29  && !searchList )
28030 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
28040 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65   trunk has no le
28050 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73  aves and the lis
28060 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73  t is not being s
28070 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20  earched. .      
28080 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20    ** So extract 
28090 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
280a0 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74  tself and use it
280b0 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20   as the newly . 
280c0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
280d0 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ted page */.    
280e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 65      assert( pPre
280f0 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20  vTrunk==0 );.   
28100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28110 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
28120 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
28130 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
28140 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
28150 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
28160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28170 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
28180 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  unk;.        mem
28190 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
281a0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
281b0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
281c0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
281d0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
281e0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
281f0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
28200 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
28210 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
28220 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
28230 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65   n-1));.      }e
28240 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28  lse if( k>(u32)(
28250 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
28260 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20  4 - 2) ){.      
28270 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20    /* Value of k 
28280 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
28290 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
282a0 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
282b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
282c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
282d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
282e0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
282f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
28300 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
28310 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
28320 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d 3d  List && nearby==
28330 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  iTrunk ){.      
28340 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
28350 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
28360 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
28370 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
28380 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
28390 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
283a0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
283b0 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
283c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
283d0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d  assert( *pPgno==
283e0 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20  iTrunk );.      
283f0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
28400 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
28410 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
28420 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28430 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
28440 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
28450 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
28460 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
28470 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
28480 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28490 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
284a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
284b0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
284c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
284d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
284e0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
284f0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
28500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28510 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
28520 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
28530 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
28540 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
28550 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28560 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
28570 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
28580 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
28590 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
285a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
285b0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
285c0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
285d0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
285e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
285f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
28600 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
28610 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
28620 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
28630 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
28640 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
28650 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
28660 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
28670 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
28680 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
28690 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
286a0 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
286b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
286c0 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
286d0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
286e0 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
286f0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
28700 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
28710 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
28720 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
28730 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28740 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
28750 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
28760 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
28770 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
28780 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
28790 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
287a0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
287b0 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
287c0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77  etPage(pBt, iNew
287d0 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e  Trunk, &pNewTrun
287e0 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  k, 0);.         
287f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
28800 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
28810 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
28820 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
28830 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
28840 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
28850 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b  rWrite(pNewTrunk
28860 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28870 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
28880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28890 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
288a0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
288b0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
288c0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
288d0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
288e0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
288f0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
28900 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
28910 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
28920 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
28930 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
28940 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
28950 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
28960 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  ewTrunk->aData[8
28970 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
28980 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b  a[12], (k-1)*4);
28990 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
289a0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
289b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
289c0 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a   !pPrevTrunk ){.
289d0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
289e0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
289f0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
28a00 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  e1->pDbPage) );.
28a10 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
28a20 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
28a30 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75  ata[32], iNewTru
28a40 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
28a50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28a60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28a70 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
28a80 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
28a90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
28aa0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
28ab0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
28ac0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
28ad0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28ae0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
28af0 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61  PrevTrunk->aData
28b00 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  [0], iNewTrunk);
28b10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
28b30 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
28b40 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
28b50 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
28b60 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
28b70 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
28b80 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
28b90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30     }else if( k>0
28ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
28bb0 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72  xtract a leaf fr
28bc0 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a  om the trunk */.
28bd0 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73          u32 clos
28be0 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e  est;.        Pgn
28bf0 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  o iPage;.       
28c00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
28c10 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e  aData = pTrunk->
28c20 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69  aData;.        i
28c30 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20  f( nearby>0 ){. 
28c40 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a           u32 i;.
28c50 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
28c60 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  st;.          cl
28c70 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
28c80 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69       dist = sqli
28c90 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
28ca0 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20  byte(&aData[8]) 
28cb0 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20  - nearby);.     
28cc0 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
28cd0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
28ce0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
28cf0 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
28d00 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
28d10 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b  i*4]) - nearby);
28d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
28d30 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
28d40 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
28d50 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
28d60 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
28d70 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
28d80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28da0 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
28db0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
28dc0 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
28dd0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
28de0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
28df0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
28e00 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
28e10 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d       if( iPage>m
28e20 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
28e30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
28e40 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
28e50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
28e60 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
28e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28e80 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
28e90 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
28ea0 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c      if( !searchL
28eb0 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65  ist || iPage==ne
28ec0 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
28ed0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
28ee0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
28ef0 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
28f00 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
28f10 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
28f20 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
28f30 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
28f40 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
28f50 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
28f60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
28f70 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
28f80 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
28f90 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
28fa0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
28fb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
28fc0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
28fd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
28fe0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
28ff0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
29000 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
29010 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
29020 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
29030 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
29040 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
29050 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
29060 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
29070 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
29080 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
29090 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
290a0 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
290b0 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20  pBt, *pPgno);.  
290c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
290d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
290e0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
290f0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
29100 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29120 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
29130 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
29140 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
29150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
29160 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
29170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
29180 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
29190 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
291a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
291b0 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
291c0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
291d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
291e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
291f0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
29200 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
29210 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
29220 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
29230 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
29240 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
29250 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
29260 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  so create a new 
29270 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20  page at the.    
29280 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
29290 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  le */.    rc = s
292a0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
292b0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
292c0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
292d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
292e0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
292f0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
29300 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
29310 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
29320 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
29330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29340 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
29350 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
29360 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
29370 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
29380 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
29390 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
293a0 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
293b0 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
293c0 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
293d0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
293e0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
293f0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
29400 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
29410 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
29420 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
29430 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
29440 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
29450 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
29460 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
29470 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
29480 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
29490 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
294a0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
294b0 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
294c0 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
294d0 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
294e0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
294f0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
29500 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
29510 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
29520 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  age(pBt, pBt->nP
29530 61 67 65 2c 20 26 70 50 67 2c 20 31 29 3b 0a 20  age, &pPg, 1);. 
29540 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
29570 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
29580 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
29590 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
295a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
295b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
295c0 72 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  rc;.      pBt->n
295d0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
295e0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45  ( pBt->nPage==PE
295f0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
29600 70 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61  pBt) ){ pBt->nPa
29610 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65  ge++; }.    }.#e
29620 6e 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74  ndif.    put4byt
29630 65 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d  e(28 + (u8*)pBt-
29640 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20  >pPage1->aData, 
29650 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20  pBt->nPage);.   
29660 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e   *pPgno = pBt->n
29670 50 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72  Page;..    asser
29680 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
29690 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
296a0 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74  ) );.    rc = bt
296b0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
296c0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
296d0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  1);.    if( rc )
296e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
296f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
29700 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
29710 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
29720 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29730 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
29740 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
29750 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
29760 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
29770 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
29780 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
29790 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
297a0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
297b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
297c0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
297d0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
297e0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
297f0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
29800 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  unk);.  if( rc==
29810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29820 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
29830 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a  rPageRefcount((*
29840 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
29850 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  )>1 ){.      rel
29860 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
29870 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29880 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29890 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
298a0 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
298b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
298c0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
298d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
298e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
298f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
29900 74 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29  teable((*ppPage)
29910 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
29920 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29930 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
29940 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
29950 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
29960 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29970 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
29980 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
29990 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
299a0 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
299b0 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
299c0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
299d0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
299e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
299f0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
29a00 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
29a10 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
29a20 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
29a30 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
29a40 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
29a50 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
29a60 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
29a70 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
29a80 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
29a90 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
29aa0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
29ab0 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
29ac0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
29ad0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
29ae0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
29af0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
29b00 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
29b10 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
29b20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
29b30 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
29b40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
29b50 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
29b60 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
29b70 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
29b80 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
29b90 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
29ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
29bb0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
29bc0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
29bd0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
29be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29bf0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
29c00 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
29c10 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
29c20 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
29c30 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
29c40 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
29c50 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
29c60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c80 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
29c90 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
29ca0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
29cb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29cd0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
29ce0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
29cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d00 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
29d10 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
29d20 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
29d30 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
29d40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29d50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
29d60 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20  assert( iPage>1 
29d70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
29d80 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
29d90 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
29da0 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  );..  if( pMemPa
29db0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
29dc0 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
29dd0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
29de0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
29df0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
29e00 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
29e10 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
29e20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
29e30 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
29e40 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
29e50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
29e60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29e70 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
29e80 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
29e90 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
29ea0 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
29eb0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
29ec0 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
29ed0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
29ee0 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
29ef0 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 73 65  ;..  if( pBt->se
29f00 63 75 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20  cureDelete ){.  
29f10 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75    /* If the secu
29f20 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e  re_delete option
29f30 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
29f40 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  n.    ** always 
29f50 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20  fully overwrite 
29f60 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
29f70 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a  ion with zeros..
29f80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
29f90 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d  !pPage && ((rc =
29fa0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
29fb0 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
29fc0 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20  , 0))!=0) ).    
29fd0 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
29fe0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
29ff0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2a000 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20  DbPage))!=0).   
2a010 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
2a020 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
2a030 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
2a040 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70  age->aData, 0, p
2a050 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53  Page->pBt->pageS
2a060 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
2a070 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2a080 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
2a090 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
2a0a0 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
2a0b0 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
2a0c0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
2a0d0 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
2a0e0 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
2a0f0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70  OVACUUM ){.    p
2a100 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50  trmapPut(pBt, iP
2a110 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
2a120 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20  PAGE, 0, &rc);. 
2a130 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2a140 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
2a150 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e   }..  /* Now man
2a160 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75  ipulate the actu
2a170 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65  al database free
2a180 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  -list structure.
2a190 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20   There are two. 
2a1a0 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65   ** possibilitie
2a1b0 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  s. If the free-l
2a1c0 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ist is currently
2a1d0 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68   empty, or if th
2a1e0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75  e first.  ** tru
2a1f0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
2a200 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
2a210 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
2a220 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20   will become a. 
2a230 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73   ** new free-lis
2a240 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74  t trunk page. Ot
2a250 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
2a260 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f   become a leaf o
2a270 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  f the.  ** first
2a280 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
2a290 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d  he current free-
2a2a0 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  list. This block
2a2b0 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a   tests if it.  *
2a2c0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
2a2d0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73   add the page as
2a2e0 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
2a2f0 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66   leaf..  */.  if
2a300 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20  ( nFree!=0 ){.  
2a310 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20    u32 nLeaf;    
2a320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a330 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
2a340 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74   leaf cells on t
2a350 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20  runk page */..  
2a360 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
2a370 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2a380 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20  ta[32]);.    rc 
2a390 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
2a3a0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
2a3b0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
2a3c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2a3d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
2a3e0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2a3f0 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65  ..    nLeaf = ge
2a400 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
2a410 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61  aData[4]);.    a
2a420 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62  ssert( pBt->usab
2a430 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20  leSize>32 );.   
2a440 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33   if( nLeaf > (u3
2a450 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
2a460 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20  e/4 - 2 ){.     
2a470 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2a480 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2a490 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2a4a0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
2a4b0 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70  ( nLeaf < (u32)p
2a4c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
2a4d0 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a   - 8 ){.      /*
2a4e0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2a4f0 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74  ere is room on t
2a500 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f  he trunk page to
2a510 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65   insert the page
2a520 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
2a530 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c  freed as a new l
2a540 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  eaf..      **.  
2a550 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
2a560 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
2a570 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75  is not really fu
2a580 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74  ll until it cont
2a590 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73  ains.      ** us
2a5a0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65  ableSize/4 - 2 e
2a5b0 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62  ntries, not usab
2a5c0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
2a5d0 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a  ries as we have.
2a5e0 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20        ** coded. 
2a5f0 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f   But due to a co
2a600 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65  ding error in ve
2a610 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2a620 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20   prior to.      
2a630 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61  ** 3.6.0, databa
2a640 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73  ses with freelis
2a650 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f  t trunk pages ho
2a660 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a  lding more than.
2a670 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
2a680 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
2a690 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74  s will be report
2a6a0 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20  ed as corrupt.  
2a6b0 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  In order.      *
2a6c0 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61  * to maintain ba
2a6d0 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
2a6e0 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72  ility with older
2a6f0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2a700 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65  ite,.      ** we
2a710 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
2a720 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e  o restrict the n
2a730 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
2a740 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   to usableSize/4
2a750 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f   - 8.      ** fo
2a760 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20  r now.  At some 
2a770 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
2a780 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f  ure (once everyo
2a790 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a  ne has upgraded.
2a7a0 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e        ** to 3.6.
2a7b0 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73  0 or later) we s
2a7c0 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66  hould consider f
2a7d0 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74  ixing the condit
2a7e0 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20  ional above.    
2a7f0 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73    ** to read "us
2a800 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e  ableSize/4-2" in
2a810 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65  stead of "usable
2a820 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20  Size/4-8"..     
2a830 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2a840 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2a850 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
2a860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2a870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a880 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
2a890 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
2a8a0 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
2a8b0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
2a8c0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
2a8d0 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
2a8e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
2a8f0 65 20 26 26 20 21 70 42 74 2d 3e 73 65 63 75 72  e && !pBt->secur
2a900 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  eDelete ){.     
2a910 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
2a920 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65  rDontWrite(pPage
2a930 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2a940 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
2a950 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
2a960 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
2a970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2a980 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
2a990 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
2a9a0 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
2a9b0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
2a9c0 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
2a9d0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
2a9e0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
2a9f0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
2aa00 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
2aa10 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
2aa20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
2aa30 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
2aa40 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
2aa50 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
2aa60 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
2aa70 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
2aa80 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
2aa90 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
2aaa0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
2aab0 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
2aac0 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
2aad0 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
2aae0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2aaf0 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
2ab00 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
2ab10 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
2ab20 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
2ab30 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
2ab40 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
2ab50 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
2ab60 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c   pPage==0 && SQL
2ab70 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74  ITE_OK!=(rc = bt
2ab80 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2ab90 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
2aba0 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  )) ){.    goto f
2abb0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
2abc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2abd0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2abe0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
2abf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2ac00 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
2ac10 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
2ac20 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
2ac30 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
2ac40 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
2ac50 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
2ac60 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2ac70 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
2ac80 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
2ac90 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
2aca0 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
2acb0 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
2acc0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
2acd0 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
2ace0 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
2acf0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
2ad00 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
2ad10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2ad20 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
2ad30 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
2ad40 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
2ad50 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28  c void freePage(
2ad60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2ad70 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28  int *pRC){.  if(
2ad80 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f   (*pRC)==SQLITE_
2ad90 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  OK ){.    *pRC =
2ada0 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65   freePage2(pPage
2adb0 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50  ->pBt, pPage, pP
2adc0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
2add0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e  }../*.** Free an
2ade0 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
2adf0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2ae00 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e   the given Cell.
2ae10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2ae20 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65  learCell(MemPage
2ae30 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65   *pPage, unsigne
2ae40 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a  d char *pCell){.
2ae50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2ae60 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2ae70 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
2ae80 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a   Pgno ovflPgno;.
2ae90 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2aea0 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66  nOvfl;.  u32 ovf
2aeb0 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73  lPageSize;..  as
2aec0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2aed0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2aee0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2aef0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2af00 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
2af10 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
2af20 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
2af30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2af40 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
2af50 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
2af60 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
2af70 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
2af80 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c  /.  }.  if( pCel
2af90 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l+info.iOverflow
2afa0 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  +3 > pPage->aDat
2afb0 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
2afc0 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
2afd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20  SQLITE_CORRUPT; 
2afe0 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
2aff0 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
2b000 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
2b010 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
2b020 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
2b030 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
2b040 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
2b050 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
2b060 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
2b070 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
2b080 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
2b090 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
2b0a0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
2b0b0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
2b0c0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
2b0d0 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
2b0e0 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
2b0f0 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
2b100 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
2b110 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
2b120 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
2b130 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
2b140 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
2b150 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
2b160 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
2b170 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
2b180 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
2b190 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
2b1a0 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
2b1b0 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
2b1c0 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
2b1d0 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
2b1e0 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
2b1f0 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
2b200 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2b210 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
2b220 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2b230 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
2b240 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
2b250 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
2b260 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
2b270 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
2b280 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
2b290 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2b2a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
2b2b0 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
2b2c0 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
2b2d0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
2b2e0 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
2b2f0 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
2b300 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
2b310 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
2b320 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
2b330 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
2b340 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
2b350 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
2b360 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
2b370 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
2b380 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2b390 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
2b3a0 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
2b3b0 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
2b3c0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
2b3d0 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
2b3e0 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
2b3f0 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
2b400 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
2b410 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
2b420 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
2b430 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
2b440 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
2b450 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
2b460 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
2b470 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
2b480 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
2b490 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
2b4a0 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
2b4b0 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
2b4c0 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
2b4d0 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
2b4e0 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
2b4f0 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
2b500 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
2b510 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
2b520 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
2b530 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
2b540 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
2b550 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
2b560 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
2b570 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
2b580 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
2b590 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
2b5a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
2b5b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b5c0 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
2b5d0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
2b5e0 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
2b5f0 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
2b600 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
2b610 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
2b620 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
2b630 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
2b640 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
2b650 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b660 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
2b670 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
2b680 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2b690 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
2b6a0 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
2b6b0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
2b6c0 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
2b6d0 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
2b6e0 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
2b6f0 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
2b700 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
2b710 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
2b720 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
2b730 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
2b740 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
2b750 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
2b760 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
2b770 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
2b780 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
2b790 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
2b7a0 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
2b7b0 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
2b7c0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
2b7d0 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
2b7e0 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
2b7f0 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
2b800 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
2b810 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
2b820 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
2b830 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
2b840 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
2b850 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
2b860 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
2b870 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
2b880 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
2b890 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
2b8a0 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
2b8b0 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
2b8c0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
2b8d0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
2b8e0 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
2b8f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2b900 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
2b910 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
2b920 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
2b930 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
2b940 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
2b950 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
2b960 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
2b970 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
2b980 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
2b990 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b9b0 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
2b9c0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
2b9d0 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
2b9e0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
2b9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
2ba00 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
2ba10 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
2ba20 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
2ba30 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
2ba40 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
2ba50 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
2ba60 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
2ba70 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
2ba80 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
2ba90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2baa0 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
2bab0 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
2bac0 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
2bad0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2bae0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
2baf0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
2bb00 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  der;.  CellInfo 
2bb10 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  info;..  assert(
2bb20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2bb30 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2bb40 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2bb50 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63  pPage is not nec
2bb60 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62  essarily writeab
2bb70 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d  le since pCell m
2bb80 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72  ight be auxiliar
2bb90 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70  y.  ** buffer sp
2bba0 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61  ace that is sepa
2bbb0 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50  rate from the pP
2bbc0 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20  age buffer area 
2bbd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  */.  assert( pCe
2bbe0 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  ll<pPage->aData 
2bbf0 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65  || pCell>=&pPage
2bc00 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
2bc10 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
2bc20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
2bc30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
2bc40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
2bc50 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
2bc60 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
2bc70 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69  nHeader = 0;.  i
2bc80 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2bc90 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
2bca0 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 4;.  }.  if( p
2bcb0 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
2bcc0 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20  .    nHeader += 
2bcd0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
2bce0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61  [nHeader], nData
2bcf0 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65  +nZero);.  }else
2bd00 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a  {.    nData = nZ
2bd10 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ero = 0;.  }.  n
2bd20 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
2bd30 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
2bd40 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65  er], *(u64*)&nKe
2bd50 79 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65  y);.  btreeParse
2bd60 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
2bd70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
2bd80 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65  assert( info.nHe
2bd90 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b  ader==nHeader );
2bda0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
2bdb0 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20  nKey==nKey );.  
2bdc0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61  assert( info.nDa
2bdd0 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b  ta==(u32)(nData+
2bde0 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f  nZero) );.  .  /
2bdf0 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
2be00 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c  yload */.  nPayl
2be10 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
2be20 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
2be30 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2be40 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
2be50 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
2be60 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20      nData = 0;. 
2be70 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28   }else{ .    if(
2be80 20 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66   NEVER(nKey>0x7f
2be90 66 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d  ffffff || pKey==
2bea0 30 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  0) ){.      retu
2beb0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2bec0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
2bed0 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
2bee0 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
2bef0 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
2bf00 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
2bf10 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
2bf20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
2bf30 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
2bf40 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
2bf50 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
2bf60 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
2bf70 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
2bf80 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
2bf90 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
2bfa0 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
2bfb0 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
2bfc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2bfd0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
2bfe0 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
2bff0 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
2c000 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
2c010 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
2c020 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
2c030 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2c040 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
2c050 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
2c060 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
2c070 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
2c080 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
2c090 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
2c0a0 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
2c0b0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2c0c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2c0d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2c0e0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2c0f0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
2c100 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
2c110 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
2c120 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c130 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2c140 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
2c150 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
2c160 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
2c170 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
2c180 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
2c190 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
2c1a0 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
2c1b0 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
2c1c0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
2c1d0 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
2c1e0 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
2c1f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2c200 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
2c210 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
2c220 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
2c230 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
2c240 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
2c250 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
2c260 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
2c270 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
2c280 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
2c290 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
2c2a0 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
2c2b0 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
2c2c0 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
2c2d0 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
2c2e0 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
2c2f0 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
2c300 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
2c310 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
2c320 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
2c330 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
2c340 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2c350 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
2c360 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2c370 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
2c380 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
2c390 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
2c3a0 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
2c3b0 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
2c3c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2c3d0 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
2c3e0 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
2c3f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2c400 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
2c410 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
2c420 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c430 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
2c440 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2c450 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2c460 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
2c470 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2c480 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2c490 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
2c4a0 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
2c4b0 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
2c4c0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
2c4d0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
2c4e0 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
2c4f0 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
2c500 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
2c510 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
2c520 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
2c530 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
2c540 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
2c550 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
2c560 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
2c570 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
2c580 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
2c590 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
2c5a0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
2c5b0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
2c5c0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
2c5d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2c5e0 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
2c5f0 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
2c600 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
2c610 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
2c620 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
2c630 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c640 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2c650 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
2c660 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
2c670 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
2c680 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2c690 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
2c6a0 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
2c6b0 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
2c6c0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
2c6d0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
2c6e0 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
2c6f0 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
2c700 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
2c710 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
2c720 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
2c730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
2c740 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
2c750 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
2c760 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
2c770 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
2c780 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
2c790 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
2c7a0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
2c7b0 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
2c7c0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
2c7d0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
2c7e0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
2c7f0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
2c800 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
2c810 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
2c820 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2c830 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
2c840 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
2c850 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
2c860 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
2c870 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
2c880 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
2c890 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
2c8a0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
2c8b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2c8c0 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
2c8d0 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
2c8e0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
2c8f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
2c900 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
2c910 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2c920 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2c930 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
2c940 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
2c950 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
2c960 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
2c970 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
2c980 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
2c990 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
2c9a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c9b0 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
2c9c0 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
2c9d0 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
2c9e0 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
2c9f0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
2ca00 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
2ca10 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
2ca20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
2ca30 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
2ca40 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
2ca50 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
2ca60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
2ca70 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
2ca80 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
2ca90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2caa0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
2cab0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
2cac0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
2cad0 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
2cae0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
2caf0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
2cb00 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
2cb10 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
2cb20 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
2cb30 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
2cb40 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
2cb50 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
2cb60 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
2cb70 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
2cb80 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
2cb90 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
2cba0 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
2cbb0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
2cbc0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
2cbd0 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
2cbe0 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
2cbf0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
2cc00 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
2cc10 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32  int *pRC){.  u32
2cc20 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
2cc30 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
2cc40 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
2cc50 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
2cc60 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
2cc70 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
2cc80 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
2cc90 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
2cca0 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
2ccb0 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
2ccc0 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50 74  ] */.  u8 *endPt
2ccd0 72 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  r;     /* End of
2cce0 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 72   loop */.  int r
2ccf0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
2cd00 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
2cd10 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
2cd20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
2cd30 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
2cd40 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
2cd50 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
2cd60 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
2cd70 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  n;..  assert( id
2cd80 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
2cd90 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
2cda0 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
2cdb0 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
2cdc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2cdd0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2cde0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2cdf0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
2ce00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2ce10 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2ce20 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
2ce30 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
2ce40 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
2ce50 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
2ce60 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
2ce70 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
2ce80 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2ce90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
2cea0 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
2ceb0 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
2cec0 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
2ced0 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
2cee0 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
2cef0 63 20 3c 20 28 75 33 32 29 67 65 74 32 62 79 74  c < (u32)get2byt
2cf00 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
2cf10 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65  || pc+sz > pPage
2cf20 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2cf30 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  e ){.    *pRC = 
2cf40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2cf50 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
2cf60 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65  .  }.  rc = free
2cf70 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c  Space(pPage, pc,
2cf80 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29   sz);.  if( rc )
2cf90 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b  {.    *pRC = rc;
2cfa0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
2cfb0 0a 20 20 65 6e 64 50 74 72 20 3d 20 26 70 50 61  .  endPtr = &pPa
2cfc0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 70  ge->aCellIdx[2*p
2cfd0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 32 5d  Page->nCell - 2]
2cfe0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 53 51 4c  ;.  assert( (SQL
2cff0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
2d000 74 72 29 26 31 29 3d 3d 30 20 29 3b 20 20 2f 2a  tr)&1)==0 );  /*
2d010 20 70 74 72 20 69 73 20 61 6c 77 61 79 73 20 32   ptr is always 2
2d020 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 2a 2f  -byte aligned */
2d030 0a 20 20 77 68 69 6c 65 28 20 70 74 72 3c 65 6e  .  while( ptr<en
2d040 64 50 74 72 20 29 7b 0a 20 20 20 20 2a 28 75 31  dPtr ){.    *(u1
2d050 36 2a 29 70 74 72 20 3d 20 2a 28 75 31 36 2a 29  6*)ptr = *(u16*)
2d060 26 70 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72  &ptr[2];.    ptr
2d070 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 50 61   += 2;.  }.  pPa
2d080 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70  ge->nCell--;.  p
2d090 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2d0a0 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  r+3], pPage->nCe
2d0b0 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ll);.  pPage->nF
2d0c0 72 65 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a  ree += 2;.}../*.
2d0d0 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
2d0e0 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
2d0f0 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
2d100 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
2d110 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
2d120 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
2d130 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
2d140 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
2d150 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
2d160 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
2d170 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
2d180 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
2d190 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
2d1a0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
2d1b0 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
2d1c0 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
2d1d0 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
2d1e0 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
2d1f0 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
2d200 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  in pPage->aOvfl[
2d210 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f  ] and make it po
2d220 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  int to the cell 
2d230 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a  content (either.
2d240 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74  ** in pTemp or t
2d250 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c  he original pCel
2d260 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f  l) and also reco
2d270 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a  rd its index. .*
2d280 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  * Allocating a n
2d290 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67  ew entry in pPag
2d2a0 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69  e->aCell[] impli
2d2b0 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67  es that .** pPag
2d2c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20  e->nOverflow is 
2d2d0 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  incremented..**.
2d2e0 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e  ** If nSkip is n
2d2f0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f  on-zero, then do
2d300 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69   not copy the fi
2d310 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20  rst nSkip bytes 
2d320 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20  of the.** cell. 
2d330 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
2d340 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61  overwrite them a
2d350 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
2d360 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a  on returns. If.*
2d370 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  * nSkip is non-z
2d380 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20  ero, then pCell 
2d390 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  may not point to
2d3a0 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f   an invalid memo
2d3b0 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20  ry location .** 
2d3c0 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70  (but pCell+nSkip
2d3d0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
2d3e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
2d3f0 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  d insertCell(.  
2d400 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2d410 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
2d420 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
2d430 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
2d440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2d450 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
2d460 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
2d470 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
2d480 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
2d490 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
2d4a0 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
2d4b0 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
2d4c0 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
2d4d0 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
2d4e0 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
2d4f0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
2d500 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
2d510 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
2d520 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c   */.  Pgno iChil
2d530 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f  d,      /* If no
2d540 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20  n-zero, replace 
2d550 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69  first 4 bytes wi
2d560 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f  th this value */
2d570 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20  .  int *pRC     
2d580 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64       /* Read and
2d590 20 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f   write return co
2d5a0 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a  de from here */.
2d5b0 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30  ){.  int idx = 0
2d5c0 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20  ;      /* Where 
2d5d0 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
2d5e0 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
2d5f0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
2d600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2d610 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
2d620 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20  int end;        
2d630 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
2d640 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65  past the last ce
2d650 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
2d660 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  ta[] */.  int in
2d670 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  s;          /* I
2d680 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77  ndex in data[] w
2d690 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f  here new cell po
2d6a0 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65  inter is inserte
2d6b0 64 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  d */.  int cellO
2d6c0 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72  ffset;   /* Addr
2d6d0 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c  ess of first cel
2d6e0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
2d6f0 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  a[] */.  u8 *dat
2d700 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
2d710 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
2d720 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
2d730 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
2d740 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 6d     /* Used for m
2d750 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  oving informatio
2d760 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74 61  n around in data
2d770 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 65 6e 64 50  [] */.  u8 *endP
2d780 74 72 3b 20 20 20 20 20 20 20 2f 2a 20 45 6e 64  tr;       /* End
2d790 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
2d7a0 0a 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28  .  int nSkip = (
2d7b0 69 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b  iChild ? 4 : 0);
2d7c0 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
2d7d0 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
2d7e0 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
2d7f0 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
2d800 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
2d810 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2d820 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
2d830 61 67 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f  age->pBt) && MX_
2d840 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
2d850 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
2d860 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2d870 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
2d880 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 20 29  (pPage->aOvfl) )
2d890 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2d8a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2d8b0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2d8c0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
2d8d0 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
2d8e0 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
2d8f0 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
2d900 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
2d910 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
2d920 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
2d930 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
2d940 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
2d950 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
2d960 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
2d970 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
2d980 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
2d990 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
2d9a0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
2d9b0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
2d9c0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
2d9d0 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
2d9e0 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
2d9f0 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
2da00 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
2da10 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2da20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
2da30 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
2da40 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43  izePtr(pPage, pC
2da50 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
2da60 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
2da70 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
2da80 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
2da90 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
2daa0 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
2dab0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
2dac0 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e  p+nSkip, pCell+n
2dad0 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
2dae0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
2daf0 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
2db00 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
2db10 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
2db20 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  ll, iChild);.   
2db30 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
2db40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
2db50 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e     assert( j<(in
2db60 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  t)(sizeof(pPage-
2db70 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
2db80 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Page->aOvfl[0]))
2db90 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
2dba0 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20  Ovfl[j].pCell = 
2dbb0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
2dbc0 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d  ->aOvfl[j].idx =
2dbd0 20 28 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65   (u16)i;.  }else
2dbe0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
2dbf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2dc00 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2dc10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2dc20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dc30 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
2dc40 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
2dc50 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2dc60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2dc70 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
2dc80 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
2dc90 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
2dca0 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
2dcb0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
2dcc0 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
2dcd0 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
2dce0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
2dcf0 6e 73 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  ns = cellOffset 
2dd00 2b 20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20  + 2*i;.    rc = 
2dd10 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50  allocateSpace(pP
2dd20 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a  age, sz, &idx);.
2dd30 20 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70      if( rc ){ *p
2dd40 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b  RC = rc; return;
2dd50 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c   }.    /* The al
2dd60 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f  locateSpace() ro
2dd70 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73  utine guarantees
2dd80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
2dd90 77 6f 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20  wo properties.  
2dda0 20 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72    ** if it retur
2ddb0 6e 73 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20  ns success */.  
2ddc0 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
2ddd0 20 65 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73   end+2 );.    as
2dde0 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20  sert( idx+sz <= 
2ddf0 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
2de00 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
2de10 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
2de20 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  +;.    pPage->nF
2de30 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b  ree -= (u16)(2 +
2de40 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79   sz);.    memcpy
2de50 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
2de60 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
2de70 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 69  sz-nSkip);.    i
2de80 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
2de90 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
2dea0 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
2deb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 74 72 20 3d  .    }.    ptr =
2dec0 20 26 64 61 74 61 5b 65 6e 64 5d 3b 0a 20 20 20   &data[end];.   
2ded0 20 65 6e 64 50 74 72 20 3d 20 26 64 61 74 61 5b   endPtr = &data[
2dee0 69 6e 73 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ins];.    assert
2def0 28 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  ( (SQLITE_PTR_TO
2df00 5f 49 4e 54 28 70 74 72 29 26 31 29 3d 3d 30 20  _INT(ptr)&1)==0 
2df10 29 3b 20 20 2f 2a 20 70 74 72 20 69 73 20 61 6c  );  /* ptr is al
2df20 77 61 79 73 20 32 2d 62 79 74 65 20 61 6c 69 67  ways 2-byte alig
2df30 6e 65 64 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ned */.    while
2df40 28 20 70 74 72 3e 65 6e 64 50 74 72 20 29 7b 0a  ( ptr>endPtr ){.
2df50 20 20 20 20 20 20 2a 28 75 31 36 2a 29 70 74 72        *(u16*)ptr
2df60 20 3d 20 2a 28 75 31 36 2a 29 26 70 74 72 5b 2d   = *(u16*)&ptr[-
2df70 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 20 2d 3d  2];.      ptr -=
2df80 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75   2;.    }.    pu
2df90 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73  t2byte(&data[ins
2dfa0 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74  ], idx);.    put
2dfb0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
2dfc0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
2dfd0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
2dfe0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2dff0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e000 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42     if( pPage->pB
2e010 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2e020 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65  .      /* The ce
2e030 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61  ll may contain a
2e040 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
2e050 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
2e060 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20   so, write.     
2e070 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f   ** the entry fo
2e080 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
2e090 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  age into the poi
2e0a0 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20  nter map..      
2e0b0 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  */.      ptrmapP
2e0c0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
2e0d0 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20   pCell, pRC);.  
2e0e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
2e0f0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69  ../*.** Add a li
2e100 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61  st of cells to a
2e110 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
2e120 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
2e130 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54  ally empty..** T
2e140 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61  he cells are gua
2e150 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f  ranteed to fit o
2e160 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  n the page..*/.s
2e170 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d  tatic void assem
2e180 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61  blePage(.  MemPa
2e190 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
2e1a0 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61  The page to be a
2e1b0 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69  ssemblied */.  i
2e1c0 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20  nt nCell,       
2e1d0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
2e1e0 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74  f cells to add t
2e1f0 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  o this page */. 
2e200 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20   u8 **apCell,   
2e210 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74     /* Pointers t
2e220 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f  o cell bodies */
2e230 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20  .  u16 *aSize   
2e240 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66       /* Sizes of
2e250 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b   the cells */.){
2e260 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2e270 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2e280 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43  nter */.  u8 *pC
2e290 65 6c 6c 70 74 72 3b 20 20 20 20 20 2f 2a 20 41  ellptr;     /* A
2e2a0 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
2e2b0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
2e2c0 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
2e2d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2e2e0 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
2e2f0 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
2e300 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
2e310 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
2e320 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64   /* Pointer to d
2e330 61 74 61 20 66 6f 72 20 70 50 61 67 65 20 2a 2f  ata for pPage */
2e340 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
2e350 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2e360 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  set;           /
2e370 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64  * Offset of head
2e380 65 72 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20  er on pPage */. 
2e390 20 63 6f 6e 73 74 20 69 6e 74 20 6e 55 73 61 62   const int nUsab
2e3a0 6c 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  le = pPage->pBt-
2e3b0 3e 75 73 61 62 6c 65 53 69 7a 65 3b 20 2f 2a 20  >usableSize; /* 
2e3c0 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 70  Usable size of p
2e3d0 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  age */..  assert
2e3e0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2e3f0 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
2e400 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2e410 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2e420 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
2e430 73 65 72 74 28 20 6e 43 65 6c 6c 3e 3d 30 20 26  sert( nCell>=0 &
2e440 26 20 6e 43 65 6c 6c 3c 3d 28 69 6e 74 29 4d 58  & nCell<=(int)MX
2e450 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
2e460 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ).            &&
2e470 20 28 69 6e 74 29 4d 58 5f 43 45 4c 4c 28 70 50   (int)MX_CELL(pP
2e480 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31  age->pBt)<=10921
2e490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2e4a0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2e4b0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
2e4c0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  age) );..  /* Ch
2e4d0 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
2e4e0 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
2e4f0 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61  zeroed by zeroPa
2e500 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge() */.  assert
2e510 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
2e520 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  0 );.  assert( g
2e530 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
2e540 64 61 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55  data[hdr+5])==nU
2e550 73 61 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c  sable );..  pCel
2e560 6c 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61  lptr = &pPage->a
2e570 43 65 6c 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d  CellIdx[nCell*2]
2e580 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 6e  ;.  cellbody = n
2e590 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28 69 3d  Usable;.  for(i=
2e5a0 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b 20 69  nCell-1; i>=0; i
2e5b0 2d 2d 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 20  --){.    u16 sz 
2e5c0 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20  = aSize[i];.    
2e5d0 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
2e5e0 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 73     cellbody -= s
2e5f0 7a 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  z;.    put2byte(
2e600 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62 6f  pCellptr, cellbo
2e610 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  dy);.    memcpy(
2e620 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
2e630 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b   apCell[i], sz);
2e640 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
2e650 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
2e660 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74 65  ell);.  put2byte
2e670 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63  (&data[hdr+5], c
2e680 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67  ellbody);.  pPag
2e690 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 6e 43 65  e->nFree -= (nCe
2e6a0 6c 6c 2a 32 20 2b 20 6e 55 73 61 62 6c 65 20 2d  ll*2 + nUsable -
2e6b0 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 70 50   cellbody);.  pP
2e6c0 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 28 75 31  age->nCell = (u1
2e6d0 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  6)nCell;.}../*.*
2e6e0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
2e6f0 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
2e700 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
2e710 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
2e720 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
2e730 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
2e740 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
2e750 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
2e760 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
2e770 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
2e780 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
2e790 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
2e7a0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2e7b0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
2e7c0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
2e7d0 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
2e7e0 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
2e7f0 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
2e800 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
2e810 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
2e820 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
2e830 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
2e840 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
2e850 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
2e860 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
2e870 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
2e880 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
2e890 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
2e8a0 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
2e8b0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
2e8c0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
2e8d0 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
2e8e0 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
2e8f0 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
2e900 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
2e910 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
2e920 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
2e930 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
2e940 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
2e950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e960 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
2e970 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
2e980 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
2e990 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
2e9a0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
2e9b0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
2e9c0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
2e9d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e9e0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
2e9f0 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
2ea00 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
2ea10 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
2ea20 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
2ea30 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
2ea40 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
2ea50 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
2ea60 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
2ea70 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
2ea80 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
2ea90 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
2eaa0 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
2eab0 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
2eac0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
2ead0 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
2eae0 20 6f 66 20 74 72 79 69 6e 67 20 74 6f 20 62 61   of trying to ba
2eaf0 6c 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68  lance the 3 righ
2eb00 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65  t-most leaf page
2eb10 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61  s, just add.** a
2eb20 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
2eb30 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
2eb40 20 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65   and put the one
2eb50 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a   new entry in.**
2eb60 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69   that page.  Thi
2eb70 73 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67  s leaves the rig
2eb80 68 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74  ht side of the t
2eb90 72 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20  ree somewhat.** 
2eba0 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74  unbalanced.  But
2ebb0 20 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77   odds are that w
2ebc0 65 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74  e will be insert
2ebd0 69 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a  ing new entries.
2ebe0 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f  ** at the end so
2ebf0 6f 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f  on afterwards so
2ec00 20 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74   the nearly empt
2ec10 79 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63  y page will quic
2ec20 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20  kly.** fill up. 
2ec30 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a   On average..**.
2ec40 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20  ** pPage is the 
2ec50 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20  leaf page which 
2ec60 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
2ec70 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72  t page in the tr
2ec80 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69  ee..** pParent i
2ec90 73 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70  s its parent.  p
2eca0 50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61  Page must have a
2ecb0 20 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77   single overflow
2ecc0 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20   entry.** which 
2ecd0 69 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68  is also the righ
2ece0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20  t-most entry on 
2ecf0 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
2ed00 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
2ed10 72 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  r is used to sto
2ed20 72 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  re a temporary c
2ed30 6f 70 79 20 6f 66 20 74 68 65 20 64 69 76 69 64  opy of the divid
2ed40 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68 61 74 20  er.** cell that 
2ed50 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 65 64  will be inserted
2ed60 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 53   into pParent. S
2ed70 75 63 68 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69  uch a cell consi
2ed80 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a 20 62 79  sts of a 4.** by
2ed90 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  te page number f
2eda0 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 76 61 72  ollowed by a var
2edb0 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74  iable length int
2edc0 65 67 65 72 2e 20 49 6e 20 6f 74 68 65 72 0a 2a  eger. In other.*
2edd0 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d 6f 73 74  * words, at most
2ede0 20 31 33 20 62 79 74 65 73 2e 20 48 65 6e 63 65   13 bytes. Hence
2edf0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
2ee00 65 72 20 6d 75 73 74 20 62 65 20 61 74 0a 2a 2a  er must be at.**
2ee10 20 6c 65 61 73 74 20 31 33 20 62 79 74 65 73 20   least 13 bytes 
2ee20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
2ee30 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
2ee40 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
2ee50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67 65 20 2a  arent, MemPage *
2ee60 70 50 61 67 65 2c 20 75 38 20 2a 70 53 70 61 63  pPage, u8 *pSpac
2ee70 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
2ee80 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 50 61 67  const pBt = pPag
2ee90 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a 20 42 2d  e->pBt;    /* B-
2eea0 54 72 65 65 20 44 61 74 61 62 61 73 65 20 2a 2f  Tree Database */
2eeb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
2eec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2eed0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79          /* Newly
2eee0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2eef0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
2ef00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2ef20 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 50 67  urn Code */.  Pg
2ef30 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20 20 20 20  no pgnoNew;     
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef50 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2ef60 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a 0a 20 20  r of pNew */..  
2ef70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2ef80 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
2ef90 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
2efa0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2efb0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2efc0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
2efd0 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
2efe0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
2eff0 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20 54  ow==1 );..  /* T
2f000 68 69 73 20 65 72 72 6f 72 20 63 6f 6e 64 69 74  his error condit
2f010 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ion is now caugh
2f020 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
2f030 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
2f040 6e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  n */.  if( pPage
2f050 2d 3e 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74  ->nCell<=0 ) ret
2f060 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2f070 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41  PT_BKPT;..  /* A
2f080 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
2f090 67 65 2e 20 54 68 69 73 20 70 61 67 65 20 77 69  ge. This page wi
2f0a0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69  ll become the ri
2f0b0 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a  ght-sibling of .
2f0c0 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65    ** pPage. Make
2f0d0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2f0e0 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68   writable, so th
2f0f0 61 74 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  at the new divid
2f100 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79  er cell.  ** may
2f110 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66   be inserted. If
2f120 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72   both these oper
2f130 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65  ations are succe
2f140 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a  ssful, proceed..
2f150 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f    */.  rc = allo
2f160 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2f170 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e  t, &pNew, &pgnoN
2f180 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66  ew, 0, 0);..  if
2f190 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2f1a0 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74  ){..    u8 *pOut
2f1b0 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20   = &pSpace[4];. 
2f1c0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
2f1d0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70  Page->aOvfl[0].p
2f1e0 43 65 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a  Cell;.    u16 sz
2f1f0 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
2f200 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2f210 3b 0a 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b  ;.    u8 *pStop;
2f220 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ..    assert( sq
2f230 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2f240 65 61 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50  eable(pNew->pDbP
2f250 61 67 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65  age) );.    asse
2f260 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
2f270 5b 30 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59  [0]==(PTF_INTKEY
2f280 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  |PTF_LEAFDATA|PT
2f290 46 5f 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a  F_LEAF) );.    z
2f2a0 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54  eroPage(pNew, PT
2f2b0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
2f2c0 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b  FDATA|PTF_LEAF);
2f2d0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
2f2e0 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
2f2f0 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20  l, &szCell);..  
2f300 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2f310 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
2f320 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20  atabase, update 
2f330 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a  the pointer map.
2f340 20 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72      ** with entr
2f350 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ies for the new 
2f360 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f  page, and any po
2f370 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a  inter from the .
2f380 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74      ** cell on t
2f390 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
2f3a0 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
2f3b0 65 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a  either of these.
2f3c0 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e      ** operation
2f3d0 73 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74  s fails, the ret
2f3e0 75 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c  urn code is set,
2f3f0 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
2f400 73 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  s.    ** of the 
2f410 70 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20  parent page are 
2f420 73 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65  still manipulate
2f430 64 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65  d by thh code be
2f440 6c 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74  low..    ** That
2f450 20 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20   is Ok, at this 
2f460 70 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74  point the parent
2f470 20 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74   page is guarant
2f480 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eed to.    ** be
2f490 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
2f4a0 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  . Returning an e
2f4b0 72 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63  rror code will c
2f4c0 61 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f  ause a.    ** ro
2f4d0 6c 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20  llback, undoing 
2f4e0 61 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65  any changes made
2f4f0 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
2f500 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
2f510 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2f520 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
2f530 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2f540 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2f550 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26  pParent->pgno, &
2f560 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rc);.      if( s
2f570 7a 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c  zCell>pNew->minL
2f580 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ocal ){.        
2f590 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
2f5a0 28 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72  (pNew, pCell, &r
2f5b0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
2f5c0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61  }.  .    /* Crea
2f5d0 74 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  te a divider cel
2f5e0 6c 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  l to insert into
2f5f0 20 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69   pParent. The di
2f600 76 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a  vider cell.    *
2f610 2a 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  * consists of a 
2f620 34 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4-byte page numb
2f630 65 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d  er (the page num
2f640 62 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e  ber of pPage) an
2f650 64 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61  d.    ** a varia
2f660 62 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76  ble length key v
2f670 61 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74  alue (which must
2f680 20 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c   be the same val
2f690 75 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ue as the.    **
2f6a0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20   largest key on 
2f6b0 70 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20  pPage)..    **. 
2f6c0 20 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68     ** To find th
2f6d0 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61  e largest key va
2f6e0 6c 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69  lue on pPage, fi
2f6f0 72 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67  rst find the rig
2f700 68 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20  ht-most .    ** 
2f710 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54  cell on pPage. T
2f720 68 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65  he first two fie
2f730 6c 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c  lds of this cell
2f740 20 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a   are the .    **
2f750 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28   record-length (
2f760 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
2f770 68 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73  h integer at mos
2f780 74 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a  t 32-bits in siz
2f790 65 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68  e).    ** and th
2f7a0 65 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76  e key value (a v
2f7b0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2f7c0 6e 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65  nteger, may have
2f7d0 20 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20   any value)..   
2f7e0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66   ** The first of
2f7f0 20 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20   the while(...) 
2f800 6c 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70  loops below skip
2f810 73 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72  s over the recor
2f820 64 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20  d-length.    ** 
2f830 66 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e  field. The secon
2f840 64 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  d while(...) loo
2f850 70 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79  p copies the key
2f860 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a   value from the.
2f870 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
2f880 50 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53  Page into the pS
2f890 70 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20  pace buffer..   
2f8a0 20 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20   */.    pCell = 
2f8b0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2f8c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b  pPage->nCell-1);
2f8d0 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
2f8e0 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
2f8f0 65 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30  e( (*(pCell++)&0
2f900 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2f910 74 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70  top );.    pStop
2f920 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20   = &pCell[9];.  
2f930 20 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75    while( ((*(pOu
2f940 74 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b  t++) = *(pCell++
2f950 29 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c  ))&0x80) && pCel
2f960 6c 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20  l<pStop );..    
2f970 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
2f980 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
2f990 6e 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a  nto pParent. */.
2f9a0 20 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70      insertCell(p
2f9b0 50 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d  Parent, pParent-
2f9c0 3e 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20  >nCell, pSpace, 
2f9d0 28 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63  (int)(pOut-pSpac
2f9e0 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
2f9f0 20 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e     0, pPage->pgn
2fa00 6f 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a  o, &rc);..    /*
2fa10 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63   Set the right-c
2fa20 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20  hild pointer of 
2fa30 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74  pParent to point
2fa40 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
2fa50 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74  . */.    put4byt
2fa60 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
2fa70 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
2fa80 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77  fset+8], pgnoNew
2fa90 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c  );.  .    /* Rel
2faa0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
2fab0 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
2fac0 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61  ge. */.    relea
2fad0 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
2fae0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2faf0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2fb00 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
2fb10 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f  ANCE */..#if 0./
2fb20 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2fb30 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  on does not cont
2fb40 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20  ribute anything 
2fb50 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  to the operation
2fb60 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69   of SQLite..** i
2fb70 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61  t is sometimes a
2fb80 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61  ctivated tempora
2fb90 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67  rily while debug
2fba0 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e  ging code respon
2fbb0 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65  sible .** for se
2fbc0 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61  tting pointer-ma
2fbd0 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  p entries..*/.st
2fbe0 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43  atic int ptrmapC
2fbf0 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67  heckPages(MemPag
2fc00 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20  e **apPage, int 
2fc10 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c  nPage){.  int i,
2fc20 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   j;.  for(i=0; i
2fc30 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nPage; i++){.  
2fc40 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38    Pgno n;.    u8
2fc50 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   e;.    MemPage 
2fc60 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b  *pPage = apPage[
2fc70 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  i];.    BtShared
2fc80 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
2fc90 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
2fca0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2fcb0 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ..    for(j=0; j
2fcc0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a  <pPage->nCell; j
2fcd0 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49  ++){.      CellI
2fce0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
2fcf0 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20  u8 *z;.     .   
2fd00 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28     z = findCell(
2fd10 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20  pPage, j);.     
2fd20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
2fd30 74 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e  tr(pPage, z, &in
2fd40 66 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  fo);.      if( i
2fd50 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
2fd60 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76  .        Pgno ov
2fd70 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a  fl = get4byte(&z
2fd80 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
2fd90 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2fda0 70 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20  pGet(pBt, ovfl, 
2fdb0 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20  &e, &n);.       
2fdc0 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67   assert( n==pPag
2fdd0 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54  e->pgno && e==PT
2fde0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29  RMAP_OVERFLOW1 )
2fdf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2fe00 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2fe10 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
2fe20 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74   child = get4byt
2fe30 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74  e(z);.        pt
2fe40 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2fe50 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2fe60 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d       assert( n==
2fe70 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65  pPage->pgno && e
2fe80 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29  ==PTRMAP_BTREE )
2fe90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2fea0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2feb0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
2fec0 6e 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62  no child = get4b
2fed0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2fee0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2fef0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74  et+8]);.      pt
2ff00 72 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69  rmapGet(pBt, chi
2ff10 6c 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20  ld, &e, &n);.   
2ff20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50     assert( n==pP
2ff30 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d  age->pgno && e==
2ff40 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a  PTRMAP_BTREE );.
2ff50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2ff60 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
2ff70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2ff80 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63  ion is used to c
2ff90 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
2ffa0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e   of the b-tree n
2ffb0 6f 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f  ode stored .** o
2ffc0 6e 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  n page pFrom to 
2ffd0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67  page pTo. If pag
2ffe0 65 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20  e pFrom was not 
2fff0 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
30000 6e 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  n.** the pointer
30010 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
30020 20 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65   each child page
30030 20 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20   are updated so 
30040 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65  that the.** pare
30050 6e 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69  nt page stored i
30060 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
30070 70 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49  p is page pTo. I
30080 66 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65  f pFrom containe
30090 64 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77  d.** any cells w
300a0 69 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ith overflow pag
300b0 65 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e  e pointers, then
300c0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
300d0 6e 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  ng pointer.** ma
300e0 70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c  p entries are al
300f0 73 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68  so updated so th
30100 61 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  at the parent pa
30110 67 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a  ge is page pTo..
30120 2a 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69  **.** If pFrom i
30130 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72  s currently carr
30140 79 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f  ying any overflo
30150 77 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73  w cells (entries
30160 20 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61   in the.** MemPa
30170 67 65 2e 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79  ge.aOvfl[] array
30180 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
30190 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
301a0 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
301b0 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
301c0 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
301d0 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
301e0 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
301f0 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
30200 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
30210 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
30220 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
30230 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
30240 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
30250 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
30260 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
30270 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
30280 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
30290 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
302a0 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
302b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
302c0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
302d0 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
302e0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
302f0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
30300 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
30310 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
30320 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
30330 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
30340 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
30350 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
30360 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
30370 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
30380 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
30390 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
303a0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
303b0 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
303c0 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
303d0 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
303e0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
303f0 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
30400 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
30410 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
30420 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
30430 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
30440 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
30450 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
30460 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
30470 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
30480 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
30490 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
304a0 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
304b0 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
304c0 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
304d0 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
304e0 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
304f0 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
30500 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
30510 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
30520 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
30530 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
30540 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
30550 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
30560 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
30570 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
30580 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
30590 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
305a0 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
305b0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
305c0 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
305d0 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
305e0 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
305f0 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
30600 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
30610 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
30620 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
30630 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
30640 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
30650 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
30660 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
30670 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
30680 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
30690 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
306a0 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
306b0 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
306c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
306d0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
306e0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
306f0 6e 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  n;.    }.  .    
30700 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
30710 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
30720 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
30730 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
30740 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 66 6f 72  tries.    ** for
30750 20 61 6e 79 20 62 2d 74 72 65 65 20 6f 72 20 6f   any b-tree or o
30760 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
30770 61 74 20 70 54 6f 20 6e 6f 77 20 63 6f 6e 74 61  at pTo now conta
30780 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 73  ins the pointers
30790 20 74 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   to..    */.    
307a0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
307b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
307c0 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
307d0 28 70 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pTo);.    }.  }
307e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
307f0 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62  outine redistrib
30800 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e 20 74 68  utes cells on th
30810 65 20 69 50 61 72 65 6e 74 49 64 78 27 74 68 20  e iParentIdx'th 
30820 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
30830 0a 2a 2a 20 28 68 65 72 65 61 66 74 65 72 20 22  .** (hereafter "
30840 74 68 65 20 70 61 67 65 22 29 20 61 6e 64 20 75  the page") and u
30850 70 20 74 6f 20 32 20 73 69 62 6c 69 6e 67 73 20  p to 2 siblings 
30860 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  so that all page
30870 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68 65  s have about the
30880 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  .** same amount 
30890 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 20 55  of free space. U
308a0 73 75 61 6c 6c 79 20 61 20 73 69 6e 67 6c 65 20  sually a single 
308b0 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69 74 68 65  sibling on eithe
308c0 72 20 73 69 64 65 20 6f 66 20 74 68 65 0a 2a 2a  r side of the.**
308d0 20 70 61 67 65 20 61 72 65 20 75 73 65 64 20 69   page are used i
308e0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c  n the balancing,
308f0 20 74 68 6f 75 67 68 20 62 6f 74 68 20 73 69 62   though both sib
30900 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
30910 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20 73 69 64   from one.** sid
30920 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
30930 20 74 68 65 20 66 69 72 73 74 20 6f 72 20 6c 61   the first or la
30940 73 74 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20  st child of its 
30950 70 61 72 65 6e 74 2e 20 49 66 20 74 68 65 20 70  parent. If the p
30960 61 67 65 20 0a 2a 2a 20 68 61 73 20 66 65 77 65  age .** has fewe
30970 72 20 74 68 61 6e 20 32 20 73 69 62 6c 69 6e 67  r than 2 sibling
30980 73 20 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69  s (something whi
30990 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70  ch can only happ
309a0 65 6e 20 69 66 20 74 68 65 20 70 61 67 65 0a 2a  en if the page.*
309b0 2a 20 69 73 20 61 20 72 6f 6f 74 20 70 61 67 65  * is a root page
309c0 20 6f 72 20 61 20 63 68 69 6c 64 20 6f 66 20 61   or a child of a
309d0 20 72 6f 6f 74 20 70 61 67 65 29 20 74 68 65 6e   root page) then
309e0 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
309f0 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61 72 74 69  iblings.** parti
30a00 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62 61  cipate in the ba
30a10 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  lancing..**.** T
30a20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  he number of sib
30a30 6c 69 6e 67 73 20 6f 66 20 74 68 65 20 70 61 67  lings of the pag
30a40 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
30a50 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
30a60 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20 6f 72 20  d by .** one or 
30a70 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
30a80 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
30a90 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
30aa0 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 0a 2a  ot over full. .*
30ab0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
30ac0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
30ad0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
30ae0 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
30af0 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6d 69 67   the page.** mig
30b00 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
30b10 62 65 20 73 74 6f 72 65 64 20 69 6e 20 4d 65 6d  be stored in Mem
30b20 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e 20 54 68  Page.aData[]. Th
30b30 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
30b40 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
30b50 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69 73 20 72  overfull. This r
30b60 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
30b70 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73 20 61 6c  hat all cells al
30b80 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  located.** to th
30b90 65 20 70 61 67 65 20 61 6e 64 20 69 74 73 20 73  e page and its s
30ba0 69 62 6c 69 6e 67 73 20 66 69 74 20 69 6e 74 6f  iblings fit into
30bb0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d   MemPage.aData[]
30bc0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
30bd0 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  g..**.** In the 
30be0 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
30bf0 69 6e 67 20 74 68 65 20 70 61 67 65 20 61 6e 64  ing the page and
30c00 20 69 74 73 20 73 69 62 6c 69 6e 67 73 2c 20 63   its siblings, c
30c10 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a 2a 20 69  ells may be.** i
30c20 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 6f 72 20  nserted into or 
30c30 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
30c40 20 70 61 72 65 6e 74 20 70 61 67 65 20 28 70 50   parent page (pP
30c50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67 20 73 6f  arent). Doing so
30c60 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65 20 74 68  .** may cause th
30c70 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f  e parent page to
30c80 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
30c90 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 49   or underfull. I
30ca0 66 20 74 68 69 73 0a 2a 2a 20 68 61 70 70 65 6e  f this.** happen
30cb0 73 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  s, it is the res
30cc0 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
30cd0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 6e 76  he caller to inv
30ce0 6f 6b 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  oke the correct.
30cf0 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75  ** balancing rou
30d00 74 69 6e 65 20 74 6f 20 66 69 78 20 74 68 69 73  tine to fix this
30d10 20 70 72 6f 62 6c 65 6d 20 28 73 65 65 20 74 68   problem (see th
30d20 65 20 62 61 6c 61 6e 63 65 28 29 20 72 6f 75 74  e balance() rout
30d30 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ine). .**.** If 
30d40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69  this routine fai
30d50 6c 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f  ls for any reaso
30d60 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c 65 61 76  n, it might leav
30d70 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  e the database.*
30d80 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 65 64  * in a corrupted
30d90 20 73 74 61 74 65 2e 20 53 6f 20 69 66 20 74 68   state. So if th
30da0 69 73 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73  is routine fails
30db0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  , the database s
30dc0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c  hould.** be roll
30dd0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ed back..**.** T
30de0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
30df0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
30e00 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63 65 2c 20  on, aOvflSpace, 
30e10 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
30e20 61 0a 2a 2a 20 62 75 66 66 65 72 20 62 69 67 20  a.** buffer big 
30e30 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 6f  enough to hold o
30e40 6e 65 20 70 61 67 65 2e 20 49 66 20 77 68 69 6c  ne page. If whil
30e50 65 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  e inserting cell
30e60 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
30e70 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
30e80 6e 74 29 20 74 68 65 20 70 61 72 65 6e 74 20 70  nt) the parent p
30e90 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
30ea0 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
30eb0 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
30ec0 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
30ed0 27 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  's overflow cell
30ee0 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
30ef0 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
30f00 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
30f10 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
30f20 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
30f30 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
30f40 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
30f50 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
30f60 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
30f70 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
30f80 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
30f90 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
30fa0 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
30fb0 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
30fc0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
30fd0 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
30fe0 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
30ff0 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
31000 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
31010 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
31020 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
31030 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
31040 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
31050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31060 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
31070 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
31080 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
31090 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
310a0 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
310b0 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
310c0 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
310d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
310e0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
310f0 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
31100 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
31110 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
31120 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
31130 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
31140 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
31150 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
31160 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
31170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
31180 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
31190 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29  a root-page */.)
311a0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
311b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
311c0 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
311d0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
311e0 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
311f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
31200 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
31210 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
31220 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
31230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
31240 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
31250 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
31260 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
31270 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
31280 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
31290 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
312a0 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
312b0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
312c0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
312d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
312e0 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
312f0 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
31300 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
31310 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
31320 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
31330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
31340 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
31350 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
31360 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
31370 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
31380 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
31390 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
313a0 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
313b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
313c0 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
313d0 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
313e0 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
313f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31400 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
31410 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
31420 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
31430 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
31440 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
31450 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
31460 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
31470 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
31480 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
31490 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
314a0 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
314b0 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
314c0 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
314d0 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
314e0 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
314f0 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
31500 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
31510 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31520 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
31530 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
31540 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
31550 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
31560 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
31570 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
31580 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
31590 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
315a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
315b0 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
315c0 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
315d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
315e0 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
315f0 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
31600 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
31610 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
31620 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
31630 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
31640 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
31650 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
31660 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
31670 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
31680 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
31690 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
316a0 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
316b0 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
316c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
316d0 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
316e0 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
316f0 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
31700 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
31710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
31720 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
31730 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
31740 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
31750 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
31760 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
31770 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
31780 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
31790 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
317a0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
317b0 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
317c0 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
317d0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
317e0 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
317f0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
31800 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
31810 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
31820 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
31830 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
31840 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
31850 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
31860 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
31870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
31880 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20  pace for copies 
31890 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
318a0 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
318b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
318c0 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20      /* Temp var 
318d0 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20  to store a page 
318e0 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20  number in */..  
318f0 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  pBt = pParent->p
31900 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
31910 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
31920 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
31930 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
31940 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
31950 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
31960 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20  ge) );..#if 0.  
31970 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
31980 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
31990 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
319a0 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
319b0 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e  ent->pgno));.#en
319c0 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  dif..  /* At thi
319d0 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20  s point pParent 
319e0 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74  may have at most
319f0 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   one overflow ce
31a00 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20  ll. And if.  ** 
31a10 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  this overflow ce
31a20 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  ll is present, i
31a30 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65  t must be the ce
31a40 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e  ll with .  ** in
31a50 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20  dex iParentIdx. 
31a60 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f  This scenario co
31a70 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74  mes about when t
31a80 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
31a90 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64  * is called (ind
31aa0 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71  irectly) from sq
31ab0 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
31ac0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
31ad0 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
31ae0 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
31af0 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
31b00 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
31b10 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
31b20 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
31b30 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69  >aOvfl[0].idx==i
31b40 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20  ParentIdx );..  
31b50 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20  if( !aOvflSpace 
31b60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
31b70 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
31b80 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73  .  /* Find the s
31b90 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
31ba0 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f  balance. Also lo
31bb0 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69  cate the cells i
31bc0 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20  n pParent .  ** 
31bd0 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20  that divide the 
31be0 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74  siblings. An att
31bf0 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
31c00 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
31c10 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72   on .  ** either
31c20 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
31c30 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
31c40 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
31c50 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
31c60 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61  .  ** if there a
31c70 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
31c80 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
31c90 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20   other side. If 
31ca0 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
31cb0 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
31cc0 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
31cd0 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
31ce0 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a  nt are taken.  .
31cf0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
31d00 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74  oop also drops t
31d10 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
31d20 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
31d30 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a   page. This.  **
31d40 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e   way, the remain
31d50 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74  der of the funct
31d60 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ion does not hav
31d70 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61  e to deal with a
31d80 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  ny.  ** overflow
31d90 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61   cells in the pa
31da0 72 65 6e 74 20 70 61 67 65 2c 20 73 69 6e 63 65  rent page, since
31db0 20 69 66 20 61 6e 79 20 65 78 69 73 74 65 64 20   if any existed 
31dc0 74 68 65 79 20 77 69 6c 6c 0a 20 20 2a 2a 20 68  they will.  ** h
31dd0 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
31de0 20 72 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20   removed..  */. 
31df0 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f   i = pParent->nO
31e00 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e  verflow + pParen
31e10 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20  t->nCell;.  if( 
31e20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76  i<2 ){.    nxDiv
31e30 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d   = 0;.    nOld =
31e40 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   i+1;.  }else{. 
31e50 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20     nOld = 3;.   
31e60 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
31e70 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
31e80 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44        .      nxD
31e90 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  iv = 0;.    }els
31ea0 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78  e if( iParentIdx
31eb0 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44  ==i ){.      nxD
31ec0 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65  iv = i-2;.    }e
31ed0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76  lse{.      nxDiv
31ee0 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b   = iParentIdx-1;
31ef0 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32  .    }.    i = 2
31f00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e  ;.  }.  if( (i+n
31f10 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f  xDiv-pParent->nO
31f20 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e  verflow)==pParen
31f30 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
31f40 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e  pRight = &pParen
31f50 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
31f60 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a  ->hdrOffset+8];.
31f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69    }else{.    pRi
31f80 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ght = findCell(p
31f90 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
31fa0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
31fb0 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20  ow);.  }.  pgno 
31fc0 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68  = get4byte(pRigh
31fd0 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29  t);.  while( 1 )
31fe0 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  {.    rc = getAn
31ff0 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
32000 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b  gno, &apOld[i]);
32010 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
32020 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c       memset(apOl
32030 64 2c 20 30 2c 20 28 69 2b 31 29 2a 73 69 7a 65  d, 0, (i+1)*size
32040 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
32050 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
32060 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
32070 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
32080 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
32090 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
320a0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
320b0 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (i--)==0 ) brea
320c0 6b 3b 0a 0a 20 20 20 20 69 66 28 20 69 2b 6e 78  k;..    if( i+nx
320d0 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61 4f  Div==pParent->aO
320e0 76 66 6c 5b 30 5d 2e 69 64 78 20 26 26 20 70 50  vfl[0].idx && pP
320f0 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
32100 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
32110 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f  i] = pParent->aO
32120 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
32130 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
32140 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
32150 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
32160 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
32170 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
32180 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e        pParent->n
32190 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
321a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
321b0 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
321c0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
321d0 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
321e0 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70  erflow);.      p
321f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
32200 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
32210 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
32220 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
32230 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20  apDiv[i]);..    
32240 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65    /* Drop the ce
32250 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ll from the pare
32260 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69  nt page. apDiv[i
32270 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74  ] still points t
32280 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  o.      ** the c
32290 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70  ell within the p
322a0 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75  arent, even thou
322b0 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  gh it has been d
322c0 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  ropped..      **
322d0 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
322e0 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61  cause dropping a
322f0 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77   cell only overw
32300 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a  rites the first.
32310 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
32320 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74  tes of it, and t
32330 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
32340 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66  s not need the f
32350 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
32360 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
32370 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f  divider cell. So
32380 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
32390 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20  safe to use.    
323a0 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20    ** later on.  
323b0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
323c0 2a 2a 20 42 75 74 20 6e 6f 74 20 69 66 20 77 65  ** But not if we
323d0 20 61 72 65 20 69 6e 20 73 65 63 75 72 65 2d 64   are in secure-d
323e0 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49 6e 20 73  elete mode. In s
323f0 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
32400 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e,.      ** the 
32410 64 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69  dropCell() routi
32420 6e 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  ne will overwrit
32430 65 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  e the entire cel
32440 6c 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20  l with zeroes.. 
32450 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
32460 63 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c  case, temporaril
32470 79 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20  y copy the cell 
32480 69 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70  into the aOvflSp
32490 61 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62  ace[].      ** b
324a0 75 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62  uffer. It will b
324b0 65 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61  e copied out aga
324c0 69 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68  in as soon as th
324d0 65 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65  e aSpace[] buffe
324e0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  r.      ** is al
324f0 6c 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 20 20 20  located.  */.   
32500 20 20 20 69 66 28 20 70 42 74 2d 3e 73 65 63 75     if( pBt->secu
32510 72 65 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  reDelete ){.    
32520 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20      int iOff;.. 
32530 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 53 51         iOff = SQ
32540 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
32550 61 70 44 69 76 5b 69 5d 29 20 2d 20 53 51 4c 49  apDiv[i]) - SQLI
32560 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 50  TE_PTR_TO_INT(pP
32570 61 72 65 6e 74 2d 3e 61 44 61 74 61 29 3b 0a 20  arent->aData);. 
32580 20 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66         if( (iOff
32590 2b 73 7a 4e 65 77 5b 69 5d 29 3e 28 69 6e 74 29  +szNew[i])>(int)
325a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
325b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
325c0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
325d0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
325e0 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64 2c 20 30   memset(apOld, 0
325f0 2c 20 28 69 2b 31 29 2a 73 69 7a 65 6f 66 28 4d  , (i+1)*sizeof(M
32600 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20  emPage*));.     
32610 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
32620 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
32630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32640 20 20 20 20 6d 65 6d 63 70 79 28 26 61 4f 76 66      memcpy(&aOvf
32650 6c 53 70 61 63 65 5b 69 4f 66 66 5d 2c 20 61 70  lSpace[iOff], ap
32660 44 69 76 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d  Div[i], szNew[i]
32670 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 44  );.          apD
32680 69 76 5b 69 5d 20 3d 20 26 61 4f 76 66 6c 53 70  iv[i] = &aOvflSp
32690 61 63 65 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61  ace[apDiv[i]-pPa
326a0 72 65 6e 74 2d 3e 61 44 61 74 61 5d 3b 0a 20 20  rent->aData];.  
326b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
326c0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70        dropCell(p
326d0 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d  Parent, i+nxDiv-
326e0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
326f0 6f 77 2c 20 73 7a 4e 65 77 5b 69 5d 2c 20 26 72  ow, szNew[i], &r
32700 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
32710 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c   /* Make nMaxCel
32720 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  ls a multiple of
32730 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70   4 in order to p
32740 72 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20  reserve 8-byte. 
32750 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f   ** alignment */
32760 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28  .  nMaxCells = (
32770 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e  nMaxCells + 3)&~
32780 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  3;..  /*.  ** Al
32790 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
327a0 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
327b0 65 73 0a 20 20 2a 2f 0a 20 20 6b 20 3d 20 70 42  es.  */.  k = pB
327c0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 52 4f  t->pageSize + RO
327d0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
327e0 61 67 65 29 29 3b 0a 20 20 73 7a 53 63 72 61 74  age));.  szScrat
327f0 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78  ch =.       nMax
32800 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a  Cells*sizeof(u8*
32810 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
32820 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
32830 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
32840 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36  Cells*sizeof(u16
32850 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
32860 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
32870 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d  l */.     + pBt-
32880 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20  >pageSize       
32890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328a0 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63          /* aSpac
328b0 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 6b 2a 6e  e1 */.     + k*n
328c0 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
328d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
328f0 20 63 6f 70 69 65 73 20 28 61 70 43 6f 70 79 29   copies (apCopy)
32900 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
32910 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
32920 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29  loc( szScratch )
32930 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  ; .  if( apCell=
32940 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
32950 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
32960 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
32970 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
32980 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
32990 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
329a0 20 20 61 53 70 61 63 65 31 20 3d 20 28 75 38 2a    aSpace1 = (u8*
329b0 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&szCell[nMaxCel
329c0 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 45  ls];.  assert( E
329d0 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
329e0 45 4e 54 28 61 53 70 61 63 65 31 29 20 29 3b 0a  ENT(aSpace1) );.
329f0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
32a00 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
32a10 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
32a20 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
32a30 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
32a40 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
32a50 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
32a60 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
32a70 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
32a80 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
32a90 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
32aa0 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72   aSpace1[] and r
32ab0 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69  emove the the di
32ac0 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a  vider Cells.  **
32ad0 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
32ae0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
32af0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
32b00 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
32b10 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
32b20 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
32b30 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
32b40 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
32b50 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
32b60 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
32b70 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
32b80 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
32b90 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
32ba0 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
32bb0 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
32bc0 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
32bd0 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
32be0 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
32bf0 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
32c00 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
32c10 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
32c20 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
32c30 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
32c40 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
32c50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
32c60 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
32c70 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
32c80 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
32c90 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
32ca0 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
32cb0 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
32cc0 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
32cd0 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
32ce0 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
32cf0 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e    leafCorrection
32d00 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 6c 65 61   = apOld[0]->lea
32d10 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20  f*4;.  leafData 
32d20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e 68 61 73 44  = apOld[0]->hasD
32d30 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ata;.  for(i=0; 
32d40 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
32d50 20 20 69 6e 74 20 6c 69 6d 69 74 3b 0a 20 20 20    int limit;.   
32d60 20 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20   .    /* Before 
32d70 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65  doing anything e
32d80 6c 73 65 2c 20 74 61 6b 65 20 61 20 63 6f 70 79  lse, take a copy
32d90 20 6f 66 20 74 68 65 20 69 27 74 68 20 6f 72 69   of the i'th ori
32da0 67 69 6e 61 6c 20 73 69 62 6c 69 6e 67 0a 20 20  ginal sibling.  
32db0 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66    ** The rest of
32dc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
32dd0 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f  ill use data fro
32de0 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61 74  m the copies rat
32df0 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  her.    ** that 
32e00 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
32e10 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69  es since the ori
32e20 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c  ginal pages will
32e30 20 62 65 20 69 6e 20 74 68 65 0a 20 20 20 20 2a   be in the.    *
32e40 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
32e50 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 20  ng overwritten. 
32e60 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
32e70 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69  *pOld = apCopy[i
32e80 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 26 61  ] = (MemPage*)&a
32e90 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
32ea0 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b 0a 20 20 20  Size + k*i];.   
32eb0 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2c 20 61 70   memcpy(pOld, ap
32ec0 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d  Old[i], sizeof(M
32ed0 65 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 4f  emPage));.    pO
32ee0 6c 64 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69  ld->aData = (voi
32ef0 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b 0a 20 20 20  d*)&pOld[1];.   
32f00 20 6d 65 6d 63 70 79 28 70 4f 6c 64 2d 3e 61 44   memcpy(pOld->aD
32f10 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
32f20 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
32f30 69 7a 65 29 3b 0a 0a 20 20 20 20 6c 69 6d 69 74  ize);..    limit
32f40 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70   = pOld->nCell+p
32f50 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  Old->nOverflow;.
32f60 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f      if( pOld->nO
32f70 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
32f80 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69     for(j=0; j<li
32f90 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  mit; j++){.     
32fa0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
32fb0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
32fc0 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65        apCell[nCe
32fd0 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ll] = findOverfl
32fe0 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b  owCell(pOld, j);
32ff0 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
33000 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
33010 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
33020 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
33030 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
33040 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
33050 20 20 20 20 20 75 38 20 2a 61 44 61 74 61 20 3d       u8 *aData =
33060 20 70 4f 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20   pOld->aData;.  
33070 20 20 20 20 75 31 36 20 6d 61 73 6b 50 61 67 65      u16 maskPage
33080 20 3d 20 70 4f 6c 64 2d 3e 6d 61 73 6b 50 61 67   = pOld->maskPag
33090 65 3b 0a 20 20 20 20 20 20 75 31 36 20 63 65 6c  e;.      u16 cel
330a0 6c 4f 66 66 73 65 74 20 3d 20 70 4f 6c 64 2d 3e  lOffset = pOld->
330b0 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
330c0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
330d0 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
330e0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c    assert( nCell<
330f0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
33100 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
33110 6c 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 76 32 28  l] = findCellv2(
33120 61 44 61 74 61 2c 20 6d 61 73 6b 50 61 67 65 2c  aData, maskPage,
33130 20 63 65 6c 6c 4f 66 66 73 65 74 2c 20 6a 29 3b   cellOffset, j);
33140 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
33150 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
33160 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
33170 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
33180 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
33190 20 20 7d 0a 20 20 20 20 7d 20 20 20 20 20 20 20    }.    }       
331a0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
331b0 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
331c0 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
331d0 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
331e0 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
331f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
33200 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
33210 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
33220 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
33230 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
33240 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
33250 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
33260 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
33270 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  z<=pBt->maxLocal
33280 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61 73 73  +23 );.      ass
33290 65 72 74 28 20 69 53 70 61 63 65 31 20 3c 3d 20  ert( iSpace1 <= 
332a0 28 69 6e 74 29 70 42 74 2d 3e 70 61 67 65 53 69  (int)pBt->pageSi
332b0 7a 65 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ze );.      memc
332c0 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76 5b  py(pTemp, apDiv[
332d0 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 61  i], sz);.      a
332e0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70  pCell[nCell] = p
332f0 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74  Temp+leafCorrect
33300 69 6f 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ion;.      asser
33310 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  t( leafCorrectio
33320 6e 3d 3d 30 20 7c 7c 20 6c 65 61 66 43 6f 72 72  n==0 || leafCorr
33330 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20  ection==4 );.   
33340 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
33350 20 3d 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d   = szCell[nCell]
33360 20 2d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   - leafCorrectio
33370 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4f  n;.      if( !pO
33380 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ld->leaf ){.    
33390 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
333a0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29 3b  Correction==0 );
333b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
333c0 20 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74   pOld->hdrOffset
333d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 2f  ==0 );.        /
333e0 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e  * The right poin
333f0 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ter of the child
33400 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d   page pOld becom
33410 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20  es the left.    
33420 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f      ** pointer o
33430 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  f the divider ce
33440 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65  ll */.        me
33450 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65 6c  mcpy(apCell[nCel
33460 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74 61  l], &pOld->aData
33470 5b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d  [8], 4);.      }
33480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
33490 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
334a0 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
334b0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43     if( szCell[nC
334c0 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20  ell]<4 ){.      
334d0 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
334e0 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
334f0 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
33500 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
33510 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   szCell[nCell] =
33520 20 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   4;.        }.  
33530 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43 65 6c      }.      nCel
33540 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  l++;.    }.  }..
33550 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
33560 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
33570 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
33580 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
33590 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
335a0 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
335b0 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
335c0 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
335d0 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
335e0 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
335f0 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
33600 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
33610 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
33620 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
33630 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
33640 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
33650 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
33660 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
33670 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
33680 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
33690 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
336a0 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
336b0 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
336c0 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
336d0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
336e0 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
336f0 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
33700 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
33710 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
33720 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
33730 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
33740 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
33750 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
33760 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
33770 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
33780 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
33790 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
337a0 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
337b0 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
337c0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
337d0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
337e0 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
337f0 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
33800 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
33810 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
33820 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
33830 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
33840 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
33850 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
33860 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
33870 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
33880 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
33890 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
338a0 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
338b0 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
338c0 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
338d0 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
338e0 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
338f0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
33900 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
33910 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
33920 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20   k++;.      if( 
33930 6b 3e 4e 42 2b 31 20 29 7b 20 72 63 20 3d 20 53  k>NB+1 ){ rc = S
33940 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
33950 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  PT; goto balance
33960 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20 20  _cleanup; }.    
33970 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d  }.  }.  szNew[k]
33980 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63   = subtotal;.  c
33990 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c  ntNew[k] = nCell
339a0 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20  ;.  k++;..  /*. 
339b0 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20   ** The packing 
339c0 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20  computed by the 
339d0 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69  previous block i
339e0 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64 20  s biased toward 
339f0 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a  the siblings.  *
33a00 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69  * on the left si
33a10 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69  de.  The left si
33a20 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79  blings are alway
33a30 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77  s nearly full, w
33a40 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69  hile the.  ** ri
33a50 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
33a60 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79   might be nearly
33a70 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c   empty.  This bl
33a80 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65  ock of code atte
33a90 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a  mpts.  ** to adj
33aa0 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20  ust the packing 
33ab0 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67  of siblings to g
33ac0 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c 61  et a better bala
33ad0 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  nce..  **.  ** T
33ae0 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
33af0 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f  s more than an o
33b00 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68  ptimization.  Th
33b10 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20  e packing above 
33b20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f  might.  ** be so
33b30 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20   out of balance 
33b40 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c  as to be illegal
33b50 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
33b60 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
33b70 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68   ** sibling migh
33b80 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20  t be completely 
33b90 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a  empty.  This adj
33ba0 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f  ustment is not o
33bb0 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  ptional..  */.  
33bc0 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20  for(i=k-1; i>0; 
33bd0 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a  i--){.    int sz
33be0 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d  Right = szNew[i]
33bf0 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ;  /* Size of si
33c00 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67  bling on the rig
33c10 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ht */.    int sz
33c20 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31  Left = szNew[i-1
33c30 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69  ]; /* Size of si
33c40 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66  bling on the lef
33c50 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20  t */.    int r; 
33c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33c70 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d  Index of right-m
33c80 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74  ost cell in left
33c90 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20   sibling */.    
33ca0 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20 20  int d;          
33cb0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
33cc0 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68  first cell to th
33cd0 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20  e left of right 
33ce0 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20  sibling */..    
33cf0 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20  r = cntNew[i-1] 
33d00 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b  - 1;.    d = r +
33d10 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20   1 - leafData;. 
33d20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61     assert( d<nMa
33d30 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73  xCells );.    as
33d40 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c  sert( r<nMaxCell
33d50 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  s );.    while( 
33d60 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a  szRight==0 || sz
33d70 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b  Right+szCell[d]+
33d80 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c  2<=szLeft-(szCel
33d90 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20  l[r]+2) ){.     
33da0 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65   szRight += szCe
33db0 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[d] + 2;.     
33dc0 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c   szLeft -= szCel
33dd0 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20  l[r] + 2;.      
33de0 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20  cntNew[i-1]--;. 
33df0 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b       r = cntNew[
33e00 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20  i-1] - 1;.      
33e10 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
33e20 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Data;.    }.    
33e30 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67  szNew[i] = szRig
33e40 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d  ht;.    szNew[i-
33e50 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d  1] = szLeft;.  }
33e60 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65  ..  /* Either we
33e70 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f   found one or mo
33e80 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77  re cells (cntnew
33e90 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67 65  [0])>0) or pPage
33ea0 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74 75   is.  ** a virtu
33eb0 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
33ec0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
33ed0 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
33ee0 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
33ef0 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
33f00 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
33f10 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
33f20 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
33f30 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
33f40 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
33f50 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
33f60 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
33f70 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
33f80 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
33f90 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30 5d   ",.    apOld[0]
33fa0 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f 6c  ->pgno, .    nOl
33fb0 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d 2d  d>=2 ? apOld[1]-
33fc0 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20 6e  >pgno : 0,.    n
33fd0 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b 32  Old>=3 ? apOld[2
33fe0 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29 29  ]->pgno : 0.  ))
33ff0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
34000 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67 65  ocate k new page
34010 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70 61  s.  Reuse old pa
34020 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69 62  ges where possib
34030 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 61  le..  */.  if( a
34040 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d 31  pOld[0]->pgno<=1
34050 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
34060 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
34070 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
34080 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
34090 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70    pageFlags = ap
340a0 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d  Old[0]->aData[0]
340b0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  ;.  for(i=0; i<k
340c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
340d0 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  age *pNew;.    i
340e0 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20  f( i<nOld ){.   
340f0 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b     pNew = apNew[
34100 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20  i] = apOld[i];. 
34110 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20       apOld[i] = 
34120 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
34130 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34140 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a  pNew->pDbPage);.
34150 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20        nNew++;.  
34160 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
34170 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
34180 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  p;.    }else{.  
34190 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20      assert( i>0 
341a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c  );.      rc = al
341b0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
341c0 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
341d0 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  o, pgno, 0);.   
341e0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
341f0 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
34200 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
34210 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e   = pNew;.      n
34220 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a  New++;..      /*
34230 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
34240 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74  -map entry for t
34250 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
34260 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  age. */.      if
34270 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
34280 7b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  {.        ptrmap
34290 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70  Put(pBt, pNew->p
342a0 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
342b0 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
342c0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
342d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
342e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
342f0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
34300 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nup;.        }. 
34310 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
34320 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
34330 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77  old pages that w
34340 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61  ere not reused a
34350 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a  s new pages..  *
34360 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c  /.  while( i<nOl
34370 64 20 29 7b 0a 20 20 20 20 66 72 65 65 50 61 67  d ){.    freePag
34380 65 28 61 70 4f 6c 64 5b 69 5d 2c 20 26 72 63 29  e(apOld[i], &rc)
34390 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
343a0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
343b0 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  nup;.    release
343c0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
343d0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
343e0 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a  ;.    i++;.  }..
343f0 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68    /*.  ** Put th
34400 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61  e new pages in a
34410 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  ccending order. 
34420 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20   This helps to. 
34430 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73   ** keep entries
34440 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
34450 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68  e in order so th
34460 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f  at a scan.  ** o
34470 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61  f the table is a
34480 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
34490 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20  ough the file.  
344a0 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72  That.  ** in tur
344b0 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72  n helps the oper
344c0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20  ating system to 
344d0 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20  deliver pages.  
344e0 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ** from the disk
344f0 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20   more rapidly.. 
34500 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e   **.  ** An O(n^
34510 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72  2) insertion sor
34520 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75  t algorithm is u
34530 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20  sed, but since. 
34540 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d   ** n is never m
34550 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73  ore than NB (a s
34560 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20  mall constant), 
34570 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a  that should.  **
34580 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65   not be a proble
34590 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  m..  **.  ** Whe
345a0 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e  n NB==3, this on
345b0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d  e optimization m
345c0 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73  akes the databas
345d0 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25  e.  ** about 25%
345e0 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67   faster for larg
345f0 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64  e insertions and
34600 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f   deletions..  */
34610 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d  .  for(i=0; i<k-
34620 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  1; i++){.    int
34630 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d   minV = apNew[i]
34640 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20  ->pgno;.    int 
34650 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f  minI = i;.    fo
34660 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b  r(j=i+1; j<k; j+
34670 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  +){.      if( ap
34680 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e  New[j]->pgno<(un
34690 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20  signed)minV ){. 
346a0 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b         minI = j;
346b0 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20  .        minV = 
346c0 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a  apNew[j]->pgno;.
346d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
346e0 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a    if( minI>i ){.
346f0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
34700 54 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61 70  T;.      pT = ap
34710 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70  New[i];.      ap
34720 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d  New[i] = apNew[m
34730 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
34740 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
34750 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
34760 28 22 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64  ("new: %d(%d) %d
34770 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25  (%d) %d(%d) %d(%
34780 64 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20  d) %d(%d)\n",.  
34790 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70 67 6e 6f    apNew[0]->pgno
347a0 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20  , szNew[0],.    
347b0 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e 65 77 5b  nNew>=2 ? apNew[
347c0 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  1]->pgno : 0, nN
347d0 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d  ew>=2 ? szNew[1]
347e0 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
347f0 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d 3e 70 67  3 ? apNew[2]->pg
34800 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  no : 0, nNew>=3 
34810 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
34820 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 61 70      nNew>=4 ? ap
34830 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[3]->pgno : 0
34840 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e 65  , nNew>=4 ? szNe
34850 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[3] : 0,.    nN
34860 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77 5b 34 5d  ew>=5 ? apNew[4]
34870 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77  ->pgno : 0, nNew
34880 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a  >=5 ? szNew[4] :
34890 20 30 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28   0));..  assert(
348a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
348b0 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
348c0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
348d0 70 75 74 34 62 79 74 65 28 70 52 69 67 68 74 2c  put4byte(pRight,
348e0 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e   apNew[nNew-1]->
348f0 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  pgno);..  /*.  *
34900 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
34910 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
34920 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
34930 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
34940 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
34950 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
34960 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
34970 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
34980 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
34990 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
349a0 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
349b0 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
349c0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
349d0 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
349e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
349f0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
34a00 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20   zeroPage(pNew, 
34a10 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 20 20  pageFlags);.    
34a20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
34a30 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20  w, cntNew[i]-j, 
34a40 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43  &apCell[j], &szC
34a50 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73  ell[j]);.    ass
34a60 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c  ert( pNew->nCell
34a70 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26  >0 || (nNew==1 &
34a80 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20  & cntNew[0]==0) 
34a90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
34aa0 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  New->nOverflow==
34ab0 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d 20 63 6e  0 );..    j = cn
34ac0 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a  tNew[i];..    /*
34ad0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
34ae0 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
34af0 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65  bove was not the
34b00 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
34b10 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65  ing,.    ** inse
34b20 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  rt a divider cel
34b30 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  l into the paren
34b40 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  t page..    */. 
34b50 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4e 65     assert( i<nNe
34b60 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65 6c 6c 20  w-1 || j==nCell 
34b70 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c 6e 43 65  );.    if( j<nCe
34b80 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  ll ){.      u8 *
34b90 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  pCell;.      u8 
34ba0 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e  *pTemp;.      in
34bb0 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73  t sz;..      ass
34bc0 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
34bd0 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   );.      pCell 
34be0 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20  = apCell[j];.   
34bf0 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a     sz = szCell[j
34c00 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] + leafCorrecti
34c10 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  on;.      pTemp 
34c20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 69 4f  = &aOvflSpace[iO
34c30 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20 20 20 20  vflSpace];.     
34c40 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66   if( !pNew->leaf
34c50 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
34c60 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b  py(&pNew->aData[
34c70 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20  8], pCell, 4);. 
34c80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
34c90 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20  eafData ){.     
34ca0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65     /* If the tre
34cb0 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61  e is a leaf-data
34cc0 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73   tree, and the s
34cd0 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76  iblings are leav
34ce0 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  es, .        ** 
34cf0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f  then there is no
34d00 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
34d10 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65   apCell[]. Inste
34d20 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20  ad, the divider 
34d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  .        ** cell
34d40 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
34d50 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   integer key for
34d60 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
34d70 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20  cell of .       
34d80 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d   ** the sibling-
34d90 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61  page assembled a
34da0 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  bove only..     
34db0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65     */.        Ce
34dc0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
34dd0 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
34de0 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
34df0 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
34e00 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  [j], &info);.   
34e10 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
34e20 6d 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d  mp;.        sz =
34e30 20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26   4 + putVarint(&
34e40 70 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e  pCell[4], info.n
34e50 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54  Key);.        pT
34e60 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  emp = 0;.      }
34e70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
34e80 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20  ell -= 4;.      
34e90 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73    /* Obscure cas
34ea0 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64  e for non-leaf-d
34eb0 61 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68  ata trees: If th
34ec0 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20  e cell at pCell 
34ed0 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  was.        ** p
34ee0 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64  reviously stored
34ef0 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c   on a leaf node,
34f00 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65   and its reporte
34f10 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20  d size was 4.   
34f20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74       ** bytes, t
34f30 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61  hen it may actua
34f40 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74  lly be smaller t
34f50 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20  han this .      
34f60 20 20 2a 2a 20 28 73 65 65 20 62 74 72 65 65 50    ** (see btreeP
34f70 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34  arseCellPtr(), 4
34f80 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69   bytes is the mi
34f90 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20  nimum size of.  
34fa0 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c        ** any cel
34fb0 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d  l). But it is im
34fc0 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20  portant to pass 
34fd0 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65  the correct size
34fe0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   to .        ** 
34ff0 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f  insertCell(), so
35000 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c   reparse the cel
35010 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  l now..        *
35020 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74  *.        ** Not
35030 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20  e that this can 
35040 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20  never happen in 
35050 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66  an SQLite data f
35060 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20  ile, as all.    
35070 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65      ** cells are
35080 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
35090 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65  s. It only happe
350a0 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73  ns in b-trees us
350b0 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ed.        ** to
350c0 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53   evaluate "IN (S
350d0 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20  ELECT ...)" and 
350e0 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e  similar clauses.
350f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
35100 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a      if( szCell[j
35110 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==4 ){.        
35120 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72    assert(leafCor
35130 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20  rection==4);.   
35140 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c         sz = cell
35150 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
35160 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pCell);.       
35170 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
35180 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20 73   iOvflSpace += s
35190 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  z;.      assert(
351a0 20 73 7a 3c 3d 70 42 74 2d 3e 6d 61 78 4c 6f 63   sz<=pBt->maxLoc
351b0 61 6c 2b 32 33 20 29 3b 0a 20 20 20 20 20 20 61  al+23 );.      a
351c0 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63  ssert( iOvflSpac
351d0 65 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 70  e <= (int)pBt->p
351e0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
351f0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
35200 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
35210 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e  l, sz, pTemp, pN
35220 65 77 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ew->pgno, &rc);.
35230 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
35240 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
35250 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
35260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
35270 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
35280 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
35290 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
352a0 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44    j++;.      nxD
352b0 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iv++;.    }.  }.
352c0 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65    assert( j==nCe
352d0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
352e0 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  nOld>0 );.  asse
352f0 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
35300 69 66 28 20 28 70 61 67 65 46 6c 61 67 73 20 26  if( (pageFlags &
35310 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b   PTF_LEAF)==0 ){
35320 0a 20 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20  .    u8 *zChild 
35330 3d 20 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31  = &apCopy[nOld-1
35340 5d 2d 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20  ]->aData[8];.   
35350 20 6d 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e   memcpy(&apNew[n
35360 4e 65 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  New-1]->aData[8]
35370 2c 20 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20  , zChild, 4);.  
35380 7d 0a 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20  }..  if( isRoot 
35390 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
353a0 6c 3d 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d  l==0 && pParent-
353b0 3e 68 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65  >hdrOffset<=apNe
353c0 77 5b 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  w[0]->nFree ){. 
353d0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70     /* The root p
353e0 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
353f0 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e  e now contains n
35400 6f 20 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c  o cells. The onl
35410 79 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a  y sibling.    **
35420 20 70 61 67 65 20 69 73 20 74 68 65 20 72 69 67   page is the rig
35430 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ht-child of the 
35440 70 61 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65  parent. Copy the
35450 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
35460 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61  .    ** child pa
35470 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ge into the pare
35480 6e 74 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74  nt, decreasing t
35490 68 65 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68  he overall heigh
354a0 74 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  t of the.    ** 
354b0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
354c0 20 62 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73   by one. This is
354d0 20 64 65 73 63 72 69 62 65 64 20 61 73 20 74 68   described as th
354e0 65 20 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c  e "balance-shall
354f0 6f 77 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62  ower".    ** sub
35500 2d 61 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f  -algorithm in so
35510 6d 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  me documentation
35520 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
35530 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
35540 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
35550 73 65 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  se, the call to 
35560 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28  copyNodeContent(
35570 29 20 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61  ) .    ** sets a
35580 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ll pointer-map e
35590 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e  ntries correspon
355a0 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
355b0 20 69 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20   image pages .  
355c0 20 20 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74    ** for which t
355d0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74  he pointer is st
355e0 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ored within the 
355f0 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f  content being co
35600 70 69 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  pied..    **.   
35610 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61   ** The second a
35620 73 73 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69  ssert below veri
35630 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 68  fies that the ch
35640 69 6c 64 20 70 61 67 65 20 69 73 20 64 65 66 72  ild page is defr
35650 61 67 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20  agmented.    ** 
35660 28 69 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20  (it must be, as 
35670 69 74 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f  it was just reco
35680 6e 73 74 72 75 63 74 65 64 20 75 73 69 6e 67 20  nstructed using 
35690 61 73 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e  assemblePage()).
356a0 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20   This.    ** is 
356b0 69 6d 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65  important if the
356c0 20 70 61 72 65 6e 74 20 70 61 67 65 20 68 61 70   parent page hap
356d0 70 65 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20  pens to be page 
356e0 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
356f0 65 0a 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20  e.    ** image. 
35700 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35710 6e 4e 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61  nNew==1 );.    a
35720 73 73 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d  ssert( apNew[0]-
35730 3e 6e 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20  >nFree == .     
35740 20 20 20 28 67 65 74 32 62 79 74 65 28 26 61 70     (get2byte(&ap
35750 4e 65 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d  New[0]->aData[5]
35760 29 2d 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c  )-apNew[0]->cell
35770 4f 66 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d  Offset-apNew[0]-
35780 3e 6e 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29  >nCell*2) .    )
35790 3b 0a 20 20 20 20 63 6f 70 79 4e 6f 64 65 43 6f  ;.    copyNodeCo
357a0 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20  ntent(apNew[0], 
357b0 70 50 61 72 65 6e 74 2c 20 26 72 63 29 3b 0a 20  pParent, &rc);. 
357c0 20 20 20 66 72 65 65 50 61 67 65 28 61 70 4e 65     freePage(apNe
357d0 77 5b 30 5d 2c 20 26 72 63 29 3b 0a 20 20 7d 65  w[0], &rc);.  }e
357e0 6c 73 65 20 69 66 28 20 49 53 41 55 54 4f 56 41  lse if( ISAUTOVA
357f0 43 55 55 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 46  CUUM ){.    /* F
35800 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ix the pointer-m
35810 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
35820 6c 6c 20 74 68 65 20 63 65 6c 6c 73 20 74 68 61  ll the cells tha
35830 74 20 77 65 72 65 20 73 68 69 66 74 65 64 20 61  t were shifted a
35840 72 6f 75 6e 64 2e 20 0a 20 20 20 20 2a 2a 20 54  round. .    ** T
35850 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c  here are several
35860 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 73   different types
35870 20 6f 66 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   of pointer-map 
35880 65 6e 74 72 69 65 73 20 74 68 61 74 20 6e 65 65  entries that nee
35890 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 64  d to.    ** be d
358a0 65 61 6c 74 20 77 69 74 68 20 62 79 20 74 68 69  ealt with by thi
358b0 73 20 72 6f 75 74 69 6e 65 2e 20 53 6f 6d 65 20  s routine. Some 
358c0 6f 66 20 74 68 65 73 65 20 68 61 76 65 20 62 65  of these have be
358d0 65 6e 20 73 65 74 20 61 6c 72 65 61 64 79 2c 20  en set already, 
358e0 62 75 74 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20  but.    ** many 
358f0 68 61 76 65 20 6e 6f 74 2e 20 54 68 65 20 66 6f  have not. The fo
35900 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 73 75 6d  llowing is a sum
35910 6d 61 72 79 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mary:.    **.   
35920 20 2a 2a 20 20 20 31 29 20 54 68 65 20 65 6e 74   **   1) The ent
35930 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
35940 77 69 74 68 20 6e 65 77 20 73 69 62 6c 69 6e 67  with new sibling
35950 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65   pages that were
35960 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 20 20 20 20   not.    **     
35970 20 73 69 62 6c 69 6e 67 73 20 77 68 65 6e 20 74   siblings when t
35980 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
35990 20 63 61 6c 6c 65 64 2e 20 54 68 65 73 65 20 68   called. These h
359a0 61 76 65 20 61 6c 72 65 61 64 79 0a 20 20 20 20  ave already.    
359b0 2a 2a 20 20 20 20 20 20 62 65 65 6e 20 73 65 74  **      been set
359c0 2e 20 57 65 20 64 6f 6e 27 74 20 6e 65 65 64 20  . We don't need 
359d0 74 6f 20 77 6f 72 72 79 20 61 62 6f 75 74 20 6f  to worry about o
359e0 6c 64 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74  ld siblings that
359f0 20 77 65 72 65 0a 20 20 20 20 2a 2a 20 20 20 20   were.    **    
35a00 20 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66    moved to the f
35a10 72 65 65 2d 6c 69 73 74 20 2d 20 74 68 65 20 66  ree-list - the f
35a20 72 65 65 50 61 67 65 28 29 20 63 6f 64 65 20 68  reePage() code h
35a30 61 73 20 74 61 6b 65 6e 20 63 61 72 65 0a 20 20  as taken care.  
35a40 20 20 2a 2a 20 20 20 20 20 20 6f 66 20 74 68 6f    **      of tho
35a50 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
35a60 2a 20 20 20 32 29 20 54 68 65 20 70 6f 69 6e 74  *   2) The point
35a70 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 61  er-map entries a
35a80 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
35a90 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
35aa0 77 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 70 61  w.    **      pa
35ab0 67 65 20 69 6e 20 61 6e 79 20 6f 76 65 72 66 6c  ge in any overfl
35ac0 6f 77 20 63 68 61 69 6e 73 20 75 73 65 64 20 62  ow chains used b
35ad0 79 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  y new divider ce
35ae0 6c 6c 73 2e 20 54 68 65 73 65 20 0a 20 20 20 20  lls. These .    
35af0 2a 2a 20 20 20 20 20 20 68 61 76 65 20 61 6c 73  **      have als
35b00 6f 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74  o already been t
35b10 61 6b 65 6e 20 63 61 72 65 20 6f 66 20 62 79 20  aken care of by 
35b20 74 68 65 20 69 6e 73 65 72 74 43 65 6c 6c 28 29  the insertCell()
35b30 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   code..    **.  
35b40 20 20 2a 2a 20 20 20 33 29 20 49 66 20 74 68 65    **   3) If the
35b50 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
35b60 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
35b70 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61  hen the child pa
35b80 67 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20  ges of.    **   
35b90 20 20 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20     cells stored 
35ba0 6f 6e 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  on the sibling p
35bb0 61 67 65 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ages may need to
35bc0 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20 20   be updated..   
35bd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 34 29 20   **.    **   4) 
35be0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
35bf0 61 67 65 73 20 61 72 65 20 6e 6f 74 20 69 6e 74  ages are not int
35c00 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20 6e 6f 64  ernal intkey nod
35c10 65 73 2c 20 74 68 65 6e 20 61 6e 79 0a 20 20 20  es, then any.   
35c20 20 2a 2a 20 20 20 20 20 20 6f 76 65 72 66 6c 6f   **      overflo
35c30 77 20 70 61 67 65 73 20 75 73 65 64 20 62 79 20  w pages used by 
35c40 74 68 65 73 65 20 63 65 6c 6c 73 20 6d 61 79 20  these cells may 
35c50 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
35c60 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 28  ed.    **      (
35c70 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79 20  internal intkey 
35c80 6e 6f 64 65 73 20 6e 65 76 65 72 20 63 6f 6e 74  nodes never cont
35c90 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ain pointers to 
35ca0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 2e  overflow pages).
35cb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
35cc0 20 35 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   5) If the sibli
35cd0 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
35ce0 20 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68   leaves, then th
35cf0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
35d00 20 20 2a 2a 20 20 20 20 20 20 65 6e 74 72 69 65    **      entrie
35d10 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  s for the right-
35d20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 20 65  child pages of e
35d30 61 63 68 20 73 69 62 6c 69 6e 67 20 6d 61 79 20  ach sibling may 
35d40 6e 65 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  need.    **     
35d50 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
35d60 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 61      **.    ** Ca
35d70 73 65 73 20 31 20 61 6e 64 20 32 20 61 72 65 20  ses 1 and 2 are 
35d80 64 65 61 6c 74 20 77 69 74 68 20 61 62 6f 76 65  dealt with above
35d90 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 2e 20   by other code. 
35da0 54 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a 20  The next.    ** 
35db0 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68  block deals with
35dc0 20 63 61 73 65 73 20 33 20 61 6e 64 20 34 20 61   cases 3 and 4 a
35dd0 6e 64 20 74 68 65 20 6f 6e 65 20 61 66 74 65 72  nd the one after
35de0 20 74 68 61 74 2c 20 63 61 73 65 20 35 2e 20 53   that, case 5. S
35df0 69 6e 63 65 0a 20 20 20 20 2a 2a 20 73 65 74 74  ince.    ** sett
35e00 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 6d 61  ing a pointer ma
35e10 70 20 65 6e 74 72 79 20 69 73 20 61 20 72 65 6c  p entry is a rel
35e20 61 74 69 76 65 6c 79 20 65 78 70 65 6e 73 69 76  atively expensiv
35e30 65 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 69  e operation, thi
35e40 73 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 6f 6e  s.    ** code on
35e50 6c 79 20 73 65 74 73 20 70 6f 69 6e 74 65 72 20  ly sets pointer 
35e60 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
35e70 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66 6c 6f  child or overflo
35e80 77 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  w pages that hav
35e90 65 0a 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c  e.    ** actuall
35ea0 79 20 6d 6f 76 65 64 20 62 65 74 77 65 65 6e 20  y moved between 
35eb0 70 61 67 65 73 2e 20 20 2a 2f 0a 20 20 20 20 4d  pages.  */.    M
35ec0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
35ed0 70 4e 65 77 5b 30 5d 3b 0a 20 20 20 20 4d 65 6d  pNew[0];.    Mem
35ee0 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
35ef0 6f 70 79 5b 30 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[0];.    int 
35f00 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64  nOverflow = pOld
35f10 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
35f20 20 69 6e 74 20 69 4e 65 78 74 4f 6c 64 20 3d 20   int iNextOld = 
35f30 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b 20 6e 4f  pOld->nCell + nO
35f40 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74  verflow;.    int
35f50 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 4f   iOverflow = (nO
35f60 76 65 72 66 6c 6f 77 20 3f 20 70 4f 6c 64 2d 3e  verflow ? pOld->
35f70 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 3a 20 2d  aOvfl[0].idx : -
35f80 31 29 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 20 20  1);.    j = 0;  
35f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
35fb0 72 72 65 6e 74 20 27 6f 6c 64 27 20 73 69 62 6c  rrent 'old' sibl
35fc0 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ing page */.    
35fd0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
35fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ff0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6e     /* Current 'n
36000 65 77 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ew' sibling page
36010 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
36020 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
36030 20 20 20 20 20 20 69 6e 74 20 69 73 44 69 76 69        int isDivi
36040 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 77  der = 0;.      w
36050 68 69 6c 65 28 20 69 3d 3d 69 4e 65 78 74 4f 6c  hile( i==iNextOl
36060 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  d ){.        /* 
36070 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
36080 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
36090 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
360a0 74 20 63 65 6c 6c 20 6f 6e 20 6f 6c 64 0a 20 20  t cell on old.  
360b0 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
360c0 20 70 61 67 65 20 6a 2e 20 49 66 20 74 68 65 20   page j. If the 
360d0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
360e0 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
360f0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
36100 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
36110 20 63 65 6c 6c 20 69 20 77 61 73 20 61 20 64 69   cell i was a di
36120 76 69 64 65 72 20 63 65 6c 6c 2e 20 2a 2f 0a 20  vider cell. */. 
36130 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
36140 2b 31 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  +1 < ArraySize(a
36150 70 43 6f 70 79 29 20 29 3b 0a 20 20 20 20 20 20  pCopy) );.      
36160 20 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b    pOld = apCopy[
36170 2b 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e  ++j];.        iN
36180 65 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65  extOld = i + !le
36190 61 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e  afData + pOld->n
361a0 43 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76  Cell + pOld->nOv
361b0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
361c0 69 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  if( pOld->nOverf
361d0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
361e0 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c   nOverflow = pOl
361f0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
36200 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f          iOverflo
36210 77 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74  w = i + !leafDat
36220 61 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  a + pOld->aOvfl[
36230 30 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20 20  0].idx;.        
36240 7d 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69  }.        isDivi
36250 64 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b  der = !leafData;
36260 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20    .      }..    
36270 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c    assert(nOverfl
36280 6f 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f  ow>0 || iOverflo
36290 77 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73  w<i );.      ass
362a0 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20  ert(nOverflow<2 
362b0 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30  || pOld->aOvfl[0
362c0 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76  ].idx==pOld->aOv
362d0 66 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20  fl[1].idx-1);.  
362e0 20 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72      assert(nOver
362f0 66 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e  flow<3 || pOld->
36300 61 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f  aOvfl[1].idx==pO
36310 6c 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78  ld->aOvfl[2].idx
36320 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  -1);.      if( i
36330 3d 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ==iOverflow ){. 
36340 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
36350 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   = 1;.        if
36360 28 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e  ( (--nOverflow)>
36370 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
36380 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
36390 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
363a0 20 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e       if( i==cntN
363b0 65 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20  ew[k] ){.       
363c0 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68   /* Cell i is th
363d0 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65  e cell immediate
363e0 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
363f0 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65   last cell on ne
36400 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62  w.        ** sib
36410 6c 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20  ling page k. If 
36420 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
36430 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20   not leaf pages 
36440 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  of an.        **
36450 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20   intkey b-tree, 
36460 74 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61  then cell i is a
36470 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20   divider cell.  
36480 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  */.        pNew 
36490 3d 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20  = apNew[++k];.  
364a0 20 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 44        if( !leafD
364b0 61 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ata ) continue;.
364c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
364d0 73 65 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a  sert( j<nOld );.
364e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
364f0 6e 4e 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f  nNew );..      /
36500 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61  * If the cell wa
36510 73 20 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76  s originally div
36520 69 64 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69  ider cell (and i
36530 73 20 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20  s not now) or.  
36540 20 20 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c      ** an overfl
36550 6f 77 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74  ow cell, or if t
36560 68 65 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61  he cell was loca
36570 74 65 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ted on a differe
36580 6e 74 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20  nt sibling.     
36590 20 2a 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20   ** page before 
365a0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74  the balancing, t
365b0 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20  hen the pointer 
365c0 6d 61 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f  map entries asso
365d0 63 69 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  ciated.      ** 
365e0 77 69 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f  with any child o
365f0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
36600 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61   need to be upda
36610 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ted.  */.      i
36620 66 28 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20  f( isDivider || 
36630 70 4f 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77  pOld->pgno!=pNew
36640 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  ->pgno ){.      
36650 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
36660 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
36670 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
36680 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
36690 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[i]), PTRMAP_BT
366a0 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c  REE, pNew->pgno,
366b0 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   &rc);.        }
366c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
366d0 65 6c 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e  ell[i]>pNew->min
366e0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
366f0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
36700 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c  Ptr(pNew, apCell
36710 5b 69 5d 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  [i], &rc);.     
36720 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36730 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61   }..    if( !lea
36740 66 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20  fCorrection ){. 
36750 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
36760 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
36770 20 20 20 20 75 33 32 20 6b 65 79 20 3d 20 67 65      u32 key = ge
36780 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d  t4byte(&apNew[i]
36790 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20  ->aData[8]);.   
367a0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
367b0 42 74 2c 20 6b 65 79 2c 20 50 54 52 4d 41 50 5f  Bt, key, PTRMAP_
367c0 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d  BTREE, apNew[i]-
367d0 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20  >pgno, &rc);.   
367e0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20     }.    }..#if 
367f0 30 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72  0.    /* The ptr
36800 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 29 20  mapCheckPages() 
36810 63 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28  contains assert(
36820 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61  ) statements tha
36830 74 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20  t verify that.  
36840 20 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72    ** all pointer
36850 20 6d 61 70 20 70 61 67 65 73 20 61 72 65 20 73   map pages are s
36860 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68  et correctly. Th
36870 69 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68  is is helpful wh
36880 69 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75  ile .    ** debu
36890 67 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75  gging. This is u
368a0 73 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20  sually disabled 
368b0 62 65 63 61 75 73 65 20 61 20 63 6f 72 72 75 70  because a corrup
368c0 74 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20  t database may. 
368d0 20 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61     ** cause an a
368e0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
368f0 74 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20  t to fail.  */. 
36900 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
36910 67 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29  ges(apNew, nNew)
36920 3b 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63  ;.    ptrmapChec
36930 6b 50 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c  kPages(&pParent,
36940 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   1);.#endif.  }.
36950 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
36960 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  nt->isInit );.  
36970 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
36980 20 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25   finished: old=%
36990 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25  d new=%d cells=%
369a0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
369b0 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c  nOld, nNew, nCel
369c0 6c 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  l));..  /*.  ** 
369d0 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72  Cleanup before r
369e0 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62  eturning..  */.b
369f0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a  alance_cleanup:.
36a00 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68    sqlite3Scratch
36a10 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
36a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
36a30 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61   i++){.    relea
36a40 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
36a50 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
36a60 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
36a70 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
36a80 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20  pNew[i]);.  }.. 
36a90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
36aa0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
36ab0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36ac0 65 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  en the root page
36ad0 20 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72   of a b-tree str
36ae0 75 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65  ucture is.** ove
36af0 72 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f  rfull (has one o
36b00 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
36b10 70 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20  pages)..**.** A 
36b20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69  new child page i
36b30 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  s allocated and 
36b40 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36b50 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74  the current root
36b60 0a 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64  .** page, includ
36b70 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ing overflow cel
36b80 6c 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69  ls, are copied i
36b90 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54  nto the child. T
36ba0 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
36bb0 69 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74  is then overwrit
36bc0 74 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61  ten to make it a
36bd0 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74  n empty page wit
36be0 68 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  h the right-chil
36bf0 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f  d .** pointer po
36c00 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65  inting to the ne
36c10 77 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65  w page..**.** Be
36c20 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
36c30 61 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  all pointer-map 
36c40 65 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f  entries correspo
36c50 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a  nding to pages .
36c60 2a 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20  ** that the new 
36c70 63 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63  child-page now c
36c80 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
36c90 20 74 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e   to are updated.
36ca0 20 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f   The.** entry co
36cb0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
36cc0 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
36cd0 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ld pointer of th
36ce0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
36cf0 73 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a  s also updated..
36d00 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
36d10 66 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73  ful, *ppChild is
36d20 20 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20   set to contain 
36d30 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
36d40 68 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67  he child .** pag
36d50 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  e and SQLITE_OK 
36d60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20  is returned. In 
36d70 74 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61  this case the ca
36d80 6c 6c 65 72 20 69 73 20 72 65 71 75 69 72 65 64  ller is required
36d90 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  .** to call rele
36da0 61 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70  asePage() on *pp
36db0 43 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e  Child exactly on
36dc0 63 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ce. If an error 
36dd0 6f 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72  occurs,.** an er
36de0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
36df0 72 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c  rned and *ppChil
36e00 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
36e10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
36e20 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50  ance_deeper(MemP
36e30 61 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50  age *pRoot, MemP
36e40 61 67 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a  age **ppChild){.
36e50 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
36e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e70 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
36e80 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
36e90 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
36ea0 20 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20   *pChild = 0;   
36eb0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
36ec0 65 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  er to a new chil
36ed0 64 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  d page */.  Pgno
36ee0 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b 20   pgnoChild = 0; 
36ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
36f00 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
36f10 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
36f20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
36f30 42 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b  Bt = pRoot->pBt;
36f40 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65      /* The BTree
36f50 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
36f60 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Root->nOverflow>
36f70 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
36f80 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
36f90 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
36fa0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f  ..  /* Make pRoo
36fb0 74 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  t, the root page
36fc0 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20   of the b-tree, 
36fd0 77 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61  writable. Alloca
36fe0 74 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70  te a new .  ** p
36ff0 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
37000 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67  come the new rig
37010 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67  ht-child of pPag
37020 65 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  e. Copy the cont
37030 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
37040 20 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20   node stored on 
37050 70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e  pRoot into the n
37060 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ew child page.. 
37070 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
37080 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
37090 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
370a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
370b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  K ){.    rc = al
370c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
370d0 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67 6e  pBt,&pChild,&pgn
370e0 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70 67  oChild,pRoot->pg
370f0 6e 6f 2c 30 29 3b 0a 20 20 20 20 63 6f 70 79 4e  no,0);.    copyN
37100 6f 64 65 43 6f 6e 74 65 6e 74 28 70 52 6f 6f 74  odeContent(pRoot
37110 2c 20 70 43 68 69 6c 64 2c 20 26 72 63 29 3b 0a  , pChild, &rc);.
37120 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
37130 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 70 74  CUUM ){.      pt
37140 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
37150 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f 42  oChild, PTRMAP_B
37160 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67 6e  TREE, pRoot->pgn
37170 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
37180 20 7d 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20   }.  if( rc ){. 
37190 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b     *ppChild = 0;
371a0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
371b0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65  (pChild);.    re
371c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
371d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
371e0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
371f0 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20  Child->pDbPage) 
37200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
37210 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37220 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
37230 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
37240 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d  ( pChild->nCell=
37250 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b  =pRoot->nCell );
37260 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
37270 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
37280 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52  d into %d\n", pR
37290 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  oot->pgno, pChil
372a0 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a  d->pgno));..  /*
372b0 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c   Copy the overfl
372c0 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52  ow cells from pR
372d0 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f  oot to pChild */
372e0 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64  .  memcpy(pChild
372f0 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e  ->aOvfl, pRoot->
37300 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f  aOvfl, pRoot->nO
37310 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
37320 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29  Root->aOvfl[0]))
37330 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65  ;.  pChild->nOve
37340 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e  rflow = pRoot->n
37350 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20  Overflow;..  /* 
37360 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  Zero the content
37370 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e  s of pRoot. Then
37380 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20   install pChild 
37390 61 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  as the right-chi
373a0 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67  ld. */.  zeroPag
373b0 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d  e(pRoot, pChild-
373c0 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
373d0 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
373e0 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
373f0 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
37400 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
37410 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20  ;..  *ppChild = 
37420 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e  pChild;.  return
37430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
37440 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68  *.** The page th
37450 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c  at pCur currentl
37460 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20  y points to has 
37470 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69  just been modifi
37480 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61  ed in.** some wa
37490 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  y. This function
374a0 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20   figures out if 
374b0 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f  this modificatio
374c0 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74  n means the.** t
374d0 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ree needs to be 
374e0 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66  balanced, and if
374f0 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70   so calls the ap
37500 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63  propriate balanc
37510 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e  ing .** routine.
37520 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69   Balancing routi
37530 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  nes are:.**.**  
37540 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
37550 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65  .**   balance_de
37560 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61  eper().**   bala
37570 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f  nce_nonroot().*/
37580 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
37590 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nce(BtCursor *pC
375a0 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ur){.  int rc = 
375b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e  SQLITE_OK;.  con
375c0 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43  st int nMin = pC
375d0 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ur->pBt->usableS
375e0 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75  ize * 2 / 3;.  u
375f0 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  8 aBalanceQuickS
37600 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a  pace[13];.  u8 *
37610 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45  pFree = 0;..  TE
37620 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61  STONLY( int bala
37630 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64  nce_quick_called
37640 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e   = 0 );.  TESTON
37650 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
37660 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20  deeper_called = 
37670 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20  0 );..  do {.   
37680 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
37690 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65  r->iPage;.    Me
376a0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
376b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
376c0 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61  e];..    if( iPa
376d0 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ge==0 ){.      i
376e0 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
376f0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  low ){.        /
37700 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
37710 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73  of the b-tree is
37720 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68   overfull. In th
37730 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65  is case call the
37740 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
37750 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e  nce_deeper() fun
37760 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ction to create 
37770 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20  a new child for 
37780 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
37790 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70        ** and cop
377a0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  y the current co
377b0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f  ntents of the ro
377c0 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54  ot-page to it. T
377d0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65  he.        ** ne
377e0 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
377f0 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c  the do-loop will
37800 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69   balance the chi
37810 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ld page..       
37820 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73   */ .        ass
37830 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65  ert( (balance_de
37840 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  eper_called++)==
37850 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
37860 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  = balance_deeper
37870 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61  (pPage, &pCur->a
37880 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20  pPage[1]);.     
37890 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
378a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
378b0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
378c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  1;.          pCu
378d0 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b  r->aiIdx[0] = 0;
378e0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
378f0 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20  >aiIdx[1] = 0;. 
37900 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
37910 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d   pCur->apPage[1]
37920 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20  ->nOverflow );. 
37930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
37940 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72  else{.        br
37950 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
37960 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
37970 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26  ->nOverflow==0 &
37980 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d  & pPage->nFree<=
37990 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72  nMin ){.      br
379a0 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
379b0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20        MemPage * 
379c0 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20  const pParent = 
379d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
379e0 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74  ge-1];.      int
379f0 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43   const iIdx = pC
37a00 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d  ur->aiIdx[iPage-
37a10 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  1];..      rc = 
37a20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
37a30 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
37a40 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
37a50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
37a60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37a70 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
37a80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
37a90 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20  ge->hasData.    
37aa0 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e       && pPage->n
37ab0 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20  Overflow==1.    
37ac0 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61       && pPage->a
37ad0 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61  Ovfl[0].idx==pPa
37ae0 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20  ge->nCell.      
37af0 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70     && pParent->p
37b00 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20  gno!=1.         
37b10 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  && pParent->nCel
37b20 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20  l==iIdx.        
37b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
37b40 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69  Call balance_qui
37b50 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61  ck() to create a
37b60 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20   new sibling of 
37b70 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20  pPage on which. 
37b80 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73           ** to s
37b90 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  tore the overflo
37ba0 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f  w cell. balance_
37bb0 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20  quick() inserts 
37bc0 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20  a new cell.     
37bd0 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61       ** into pPa
37be0 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20  rent, which may 
37bf0 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76  cause pParent ov
37c00 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a  erflow. If this.
37c10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70            ** hap
37c20 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69  pens, the next i
37c30 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  nteration of the
37c40 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61   do-loop will ba
37c50 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20  lance pParent . 
37c60 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20           ** use 
37c70 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e  either balance_n
37c80 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61  onroot() or bala
37c90 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e  nce_deeper(). Un
37ca0 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20  til this.       
37cb0 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74     ** happens, t
37cc0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
37cd0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
37ce0 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
37cf0 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20  pace[].         
37d00 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20   ** buffer. .   
37d10 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
37d20 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f      ** The purpo
37d30 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
37d40 69 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20  ing assert() is 
37d50 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e  to check that on
37d60 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  ly a.          *
37d70 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f  * single call to
37d80 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
37d90 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63   is made for eac
37da0 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20  h call to this. 
37db0 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
37dc0 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65  tion. If this we
37dd0 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c  re not verified,
37de0 20 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e   a subtle bug in
37df0 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20  volving reuse.  
37e00 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68          ** of th
37e10 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  e aBalanceQuickS
37e20 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65  pace[] might sne
37e30 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20  ak in..         
37e40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
37e50 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71  sert( (balance_q
37e60 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d  uick_called++)==
37e70 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
37e80 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  c = balance_quic
37e90 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65  k(pParent, pPage
37ea0 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53  , aBalanceQuickS
37eb0 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  pace);.        }
37ec0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
37ed0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
37ee0 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  /* In this case,
37ef0 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f   call balance_no
37f00 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73  nroot() to redis
37f10 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20  tribute cells.  
37f20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65          ** betwe
37f30 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  en pPage and up 
37f40 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c  to 2 of its sibl
37f50 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20  ing pages. This 
37f60 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20  involves.       
37f70 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20     ** modifying 
37f80 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
37f90 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d  pParent, which m
37fa0 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74  ay cause pParent
37fb0 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   to.          **
37fc0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
37fd0 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54   or underfull. T
37fe0 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  he next iteratio
37ff0 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
38000 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69  .          ** wi
38010 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70  ll balance the p
38020 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f  arent page to co
38030 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20  rrect this..    
38040 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
38050 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61      ** If the pa
38060 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65  rent page become
38070 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20  s overfull, the 
38080 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72  overflow cell or
38090 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20   cells.         
380a0 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69   ** are stored i
380b0 6e 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  n the pSpace buf
380c0 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d  fer allocated im
380d0 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e  mediately below.
380e0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41   .          ** A
380f0 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
38100 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
38110 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77  loop will deal w
38120 69 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20  ith this by.    
38130 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67        ** calling
38140 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
38150 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  () (balance_deep
38160 65 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c  er() may be call
38170 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20  ed first,.      
38180 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f      ** but it do
38190 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20  esn't deal with 
381a0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d  overflow cells -
381b0 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d   just moves them
381c0 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20   to a.          
381d0 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67  ** different pag
381e0 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75  e). Once this su
381f0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
38200 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
38210 28 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  () .          **
38220 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20   has completed, 
38230 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
38240 6c 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65  lease the pSpace
38250 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a   buffer used by.
38260 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
38270 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20   previous call, 
38280 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  as the overflow 
38290 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68  cell data will h
382a0 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20  ave been .      
382b0 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69      ** copied ei
382c0 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f  ther into the bo
382d0 64 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  dy of a database
382e0 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68   page or into th
382f0 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20  e new.          
38300 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72  ** pSpace buffer
38310 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c   passed to the l
38320 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61  atter call to ba
38330 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e  lance_nonroot().
38340 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
38350 20 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61          u8 *pSpa
38360 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
38370 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74  Malloc(pCur->pBt
38380 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
38390 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
383a0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72  nce_nonroot(pPar
383b0 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63  ent, iIdx, pSpac
383c0 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20  e, iPage==1);.  
383d0 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
383e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
383f0 20 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73 20   /* If pFree is 
38400 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69  not NULL, it poi
38410 6e 74 73 20 74 6f 20 74 68 65 20 70 53 70 61 63  nts to the pSpac
38420 65 20 62 75 66 66 65 72 20 75 73 65 64 20 0a 20  e buffer used . 
38430 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79             ** by
38440 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c   a previous call
38450 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   to balance_nonr
38460 6f 6f 74 28 29 2e 2